From kde-core-devel Sun Nov 18 00:08:11 2001 From: Mickael Marchand Date: Sun, 18 Nov 2001 00:08:11 +0000 To: kde-core-devel Subject: [PATCH] KEdFind / KEdReplace from koffice to kdelibs X-MARC-Message: https://marc.info/?l=kde-core-devel&m=100604708321875 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--------------Boundary-00=_N1ZY94R2BOUVWH2GDZ17" --------------Boundary-00=_N1ZY94R2BOUVWH2GDZ17 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Hello, ->what is it: here is a the patch for the new KEdFind / KEdReplace dialogs for kdelibs this is an import of KOffice's one written by S.R. Haque. it adds internal regexp and find/replace functions but breaks compatibility with old KEdFind and KEdReplace :/ i have done a patch to kedit to give you an example of what that can do or just look to kword and kspread's find dialog. ->how it works : you have two class , KEdFind and KEdFindNext, the first one is the dialog you see when you press 'find' which asks for the text to search, regexp, options ... the second class is invoked after the execution of KEdFind, creating if necessary a 'Find Next' message box and doing all the find stuff . It provides a 'highlight' signal which allows you to implement highlighting of the searched text in your text editor. replace works the same way, but gives you two signals 'highlight' and 'replace' to update the replaced text in the editor. ->problems: The patch breaks khtml (as it has its own regexp stuff, but this can be easily fixed i think) in kdelibs and maybe kwrite/kate in kdebase (haven't tested yet) i don't commit it for now as it will break some apps, let me know what you think about it and what i should do of it ;p Cheers, Mik PS : i've tested most of the functions but it may still contain some bugs...tell me! -- Mickael Marchand Elève-ingénieur / Engineer Student Ecole des Mines de Douai - France --------------Boundary-00=_N1ZY94R2BOUVWH2GDZ17 Content-Type: text/x-diff; charset="iso-8859-1"; name="kedit.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="kedit.patch" SW5kZXg6IGtlZGl0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvaG9tZS9rZGUva2RldXRpbHMv a2VkaXQva2VkaXQuY3BwLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjE1MwpkaWZmIC11IC0zIC1w IC1yMS4xNTMga2VkaXQuY3BwCi0tLSBrZWRpdC5jcHAJMjAwMS8xMC8xOSAyMzoyOTozNAkxLjE1 MworKysga2VkaXQuY3BwCTIwMDEvMTEvMTcgMjM6MDk6MDEKQEAgLTE5OCw3ICsxOTgsNyBAQCB2 b2lkIFRvcExldmVsOjpzZXR1cEFjdGlvbnMoKQogICAgIEtTdGRBY3Rpb246OnBhc3RlKHRoaXMs IFNMT1QocGFzdGUoKSksIGFjdGlvbkNvbGxlY3Rpb24oKSk7CiAgICAgS1N0ZEFjdGlvbjo6c2Vs ZWN0QWxsKHRoaXMsIFNMT1Qoc2VsZWN0X2FsbCgpKSwgYWN0aW9uQ29sbGVjdGlvbigpKTsKICAg ICBLU3RkQWN0aW9uOjpmaW5kKHRoaXMsIFNMT1Qoc2VhcmNoKCkpLCBhY3Rpb25Db2xsZWN0aW9u KCkpOwotICAgIEtTdGRBY3Rpb246OmZpbmROZXh0KHRoaXMsIFNMT1Qoc2VhcmNoX2FnYWluKCkp LCBhY3Rpb25Db2xsZWN0aW9uKCkpOworLy8gICAgS1N0ZEFjdGlvbjo6ZmluZE5leHQodGhpcywg U0xPVChzZWFyY2hfYWdhaW4oKSksIGFjdGlvbkNvbGxlY3Rpb24oKSk7CiAgICAgS1N0ZEFjdGlv bjo6cmVwbGFjZSh0aGlzLCBTTE9UKHJlcGxhY2UoKSksIGFjdGlvbkNvbGxlY3Rpb24oKSk7CiAK ICAgICAodm9pZCluZXcgS0FjdGlvbihpMThuKCImSW5zZXJ0IEZpbGUiKSwgMCwgdGhpcywgU0xP VChmaWxlX2luc2VydCgpKSwKQEAgLTg5NiwxMSArODk2LDExIEBAIHZvaWQgVG9wTGV2ZWw6OnRv Z2dsZVN0YXR1c0JhcigpCiB9CiAKIAotdm9pZCBUb3BMZXZlbDo6c2VhcmNoX2FnYWluKCkKKy8q dm9pZCBUb3BMZXZlbDo6c2VhcmNoX2FnYWluKCkKIHsKICAgZWZyYW1lLT5yZXBlYXRTZWFyY2go KTsKICAgc3RhdHVzYmFyX3Nsb3QoKTsKLX0KK30qLwogCiAKIHZvaWQgVG9wTGV2ZWw6OnNldEZp bGVDYXB0aW9uKCkKSW5kZXg6IGtlZGl0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2hvbWUva2Rl L2tkZXV0aWxzL2tlZGl0L2tlZGl0LmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNjEKZGlmZiAt dSAtMyAtcCAtcjEuNjEga2VkaXQuaAotLS0ga2VkaXQuaAkyMDAxLzEwLzE0IDA0OjE2OjU1CTEu NjEKKysrIGtlZGl0LmgJMjAwMS8xMS8xNyAyMzowOTowMQpAQCAtMTkzLDcgKzE5Myw3IEBAIHB1 YmxpYyBzbG90czoKICAgICB2b2lkIHJlcGxhY2UoKTsKICAgICB2b2lkIHRvZ2dsZVN0YXR1c0Jh cigpOwogICAgIHZvaWQgdG9nZ2xlVG9vbEJhcigpOwotICAgIHZvaWQgc2VhcmNoX2FnYWluKCk7 CisvLyAgICB2b2lkIHNlYXJjaF9hZ2FpbigpOwogICAgIHZvaWQgdG9nZ2xlX292ZXJ3cml0ZSgp OwogICAgIHZvaWQgd3JpdGVTZXR0aW5ncygpOwogCg== --------------Boundary-00=_N1ZY94R2BOUVWH2GDZ17 Content-Type: text/x-diff; charset="iso-8859-1"; name="kdeui.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="kdeui.patch" SW5kZXg6IE1ha2VmaWxlLmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9ob21lL2tkZS9rZGVsaWJz L2tkZXVpL01ha2VmaWxlLmFtLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjI0OApkaWZmIC11IC0z IC1wIC1yMS4yNDggTWFrZWZpbGUuYW0KLS0tIE1ha2VmaWxlLmFtCTIwMDEvMTEvMTcgMTc6MTM6 MTAJMS4yNDgKKysrIE1ha2VmaWxlLmFtCTIwMDEvMTEvMTcgMjM6NDE6NTUKQEAgLTU3LDcgKzU3 LDcgQEAgaW5jbHVkZV9IRUFERVJTID0ga3Byb2dyZXNzLmgga2NvbG9yZGxnLgogCQlrcGFuZWxh cHBsZXQuaCBrcHVzaGJ1dHRvbi5oIGtkY29wYWN0aW9ucHJveHkuaCBrY29sb3Jjb21iby5oIFwK IAkJa3BhbmVsZXh0ZW5zaW9uLmgga2NvbXBsZXRpb25ib3guaCBrc3F1ZWV6ZWR0ZXh0bGFiZWwu aCBcCiAJCWtjb21tYW5kLmgga3dpbmRvd2xpc3RtZW51Lmgga2ZvbnRjb21iby5oIGthY2NlbGdl bi5oIGt0aXAuaCBcCi0JCWtkYXRld2lkZ2V0Lmgga2Fycm93YnV0dG9uLmgga2d1aWl0ZW0uaAor CQlrZGF0ZXdpZGdldC5oIGthcnJvd2J1dHRvbi5oIGtndWlpdGVtLmgga2VkZmluZC5oIGtlZHJl cGxhY2UuaAogCiAjIHRoZSBvcmRlciBvZiB0aGUgc291cmNlcyBpc24ndCByYW5kb21seSAoYXQg bGVhc3Qgbm90IGNvbXBsZXRseSkuCiAjIHRoZSBvcmRlciBpcyBwcmVkaWN0YXRlZCBieSB0aGUg dXNlIG9mIFgxMSBoZWFkZXIgZmlsZXMKQEAgLTk1LDcgKzk1LDcgQEAgbGlia2RldWlfbGFfU09V UkNFUyA9IFwKIAkJa2NvbXBsZXRpb25ib3guY3BwIGtzcXVlZXplZHRleHRsYWJlbC5jcHAga2Nt b2R1bGUuY3BwIFwKIAkJa2NvbW1hbmQuY3BwIGt3aW5kb3dsaXN0bWVudS5jcHAga2ZvbnRjb21i by5jcHAga3RpcC5jcHAgXAogCQlrZGF0ZXdpZGdldC5jcHAga2Fycm93YnV0dG9uLmNwcCBrbWFp bndpbmRvd2lmYWNlLmNwcCBcCi0gICAgICAgICAgICAgICAga21haW53aW5kb3dpZmFjZS5za2Vs IGtndWlpdGVtLmNwcAorCQkJCWttYWlud2luZG93aWZhY2Uuc2tlbCBrZ3VpaXRlbS5jcHAga2Vk ZmluZC5jcHAga2VkcmVwbGFjZS5jcHAKIAogbm9pbnN0X0hFQURFUlMgPSBrZG9ja3dpZGdldF9w cml2YXRlLmgga2xpc3R2aWV3bGluZWVkaXQuaCBra2V5YnV0dG9uLmggXAogCQlrZGlhbG9nYmFz ZV9wcml2Lmgga2Fib3V0ZGlhbG9nX3ByaXZhdGUuaCBrY3Vyc29yX3ByaXZhdGUuaCBcCkluZGV4 OiBrZWRmaW5kLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiBrZWRmaW5kLmNwcApkaWZmIC1OIGtl ZGZpbmQuY3BwCi0tLSAvZGV2L251bGwJVHVlIE1heSAgNSAyMDozMjoyNyAxOTk4CisrKyBrZWRm aW5kLmNwcAlTYXQgTm92IDE3IDIzOjQyOjA0IDIwMDEKQEAgLTAsMCArMSw2MTUgQEAKKy8qCisg ICAgQ29weXJpZ2h0IChDKSAyMDAxLCBTLlIuSGFxdWUgPHNyaGFxdWVAaWVlLm9yZz4uCisgICAg VGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0CisKKyAgICBUaGlzIGxpYnJhcnkg aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9k aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK KyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u OyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv bikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkg V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg R05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu CisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFy eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNl ZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisg ICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqLworCisjaW5jbHVkZSA8cWNoZWNrYm94 Lmg+CisjaW5jbHVkZSA8cWdyb3VwYm94Lmg+CisjaW5jbHVkZSA8cWxhYmVsLmg+CisjaW5jbHVk ZSA8cWxheW91dC5oPgorI2luY2x1ZGUgPHFwb3B1cG1lbnUuaD4KKyNpbmNsdWRlIDxxcHVzaGJ1 dHRvbi5oPgorI2luY2x1ZGUgPHFyZWdleHAuaD4KKyNpbmNsdWRlIDxrYXBwbGljYXRpb24uaD4K KyNpbmNsdWRlIDxrZGVidWcuaD4KKyNpbmNsdWRlIDxrY29tYm9ib3guaD4KKyNpbmNsdWRlIDxr bG9jYWxlLmg+CisjaW5jbHVkZSA8a2VkZmluZC5oPgorI2luY2x1ZGUgPGttZXNzYWdlYm94Lmg+ CisKK0tFZEZpbmQ6OktFZEZpbmQoUVdpZGdldCAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLCBs b25nIG9wdGlvbnMsIGNvbnN0IFFTdHJpbmdMaXN0ICZmaW5kU3RyaW5ncywgYm9vbCBoYXNTZWxl Y3Rpb24pIDoKKyAgICBLRGlhbG9nQmFzZShwYXJlbnQsIG5hbWUsIHRydWUsIGkxOG4oIkZpbmQg VGV4dCIpLCBPayB8IENhbmNlbCwgT2spCit7CisgICAgaW5pdChmYWxzZSwgZmluZFN0cmluZ3Ms IGhhc1NlbGVjdGlvbik7CisgICAgc2V0T3B0aW9ucyhvcHRpb25zKTsKK30KKworS0VkRmluZDo6 S0VkRmluZChRV2lkZ2V0ICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgLypmb3JSZXBs YWNlKi8pIDoKKyAgICBLRGlhbG9nQmFzZShwYXJlbnQsIG5hbWUsIHRydWUsIGkxOG4oIlJlcGxh Y2UgVGV4dCIpLCBPayB8IENhbmNlbCwgT2spCit7Cit9CisKK0tFZEZpbmQ6On5LRWRGaW5kKCkK K3sKK30KKworUVdpZGdldCAqS0VkRmluZDo6ZmluZEV4dGVuc2lvbigpCit7CisgICAgcmV0dXJu IG1fZmluZEV4dGVuc2lvbjsKK30KKworUVN0cmluZ0xpc3QgS0VkRmluZDo6ZmluZEhpc3Rvcnko KSBjb25zdAoreworICAgIHJldHVybiBtX2ZpbmQtPmhpc3RvcnlJdGVtcygpOworfQorCit2b2lk IEtFZEZpbmQ6OmluaXQoYm9vbCBmb3JSZXBsYWNlLCBjb25zdCBRU3RyaW5nTGlzdCAmZmluZFN0 cmluZ3MsIGJvb2wgaGFzU2VsZWN0aW9uKQoreworICAgIFFWQm94TGF5b3V0ICp0b3BMYXlvdXQ7 CisgICAgUUdyaWRMYXlvdXQgKm9wdGlvbnNMYXlvdXQ7CisKKyAgICAvLyBDcmVhdGUgY29tbW9u IHBhcnRzIG9mIGRpYWxvZy4KKyAgICBRV2lkZ2V0ICpwYWdlID0gbmV3IFFXaWRnZXQodGhpcyk7 CisgICAgc2V0TWFpbldpZGdldChwYWdlKTsKKworICAgIHRvcExheW91dCA9IG5ldyBRVkJveExh eW91dChwYWdlKTsKKyAgICB0b3BMYXlvdXQtPnNldFNwYWNpbmcoIEtEaWFsb2c6OnNwYWNpbmdI aW50KCkgKTsKKyAgICB0b3BMYXlvdXQtPnNldE1hcmdpbiggS0RpYWxvZzo6bWFyZ2luSGludCgp ICk7CisKKyAgICBtX2ZpbmRHcnAgPSBuZXcgUUdyb3VwQm94KDAsIFF0OjpWZXJ0aWNhbCwgaTE4 bigiRmluZCIpLCBwYWdlKTsKKyAgICBtX2ZpbmRHcnAtPmxheW91dCgpLT5zZXRTcGFjaW5nKEtE aWFsb2c6OnNwYWNpbmdIaW50KCkpOworICAgIG1fZmluZEdycC0+bGF5b3V0KCktPnNldE1hcmdp bihLRGlhbG9nOjptYXJnaW5IaW50KCkpOworICAgIG1fZmluZExheW91dCA9IG5ldyBRR3JpZExh eW91dChtX2ZpbmRHcnAtPmxheW91dCgpKTsKKyAgICBtX2ZpbmRMYXlvdXQtPnNldFNwYWNpbmco IEtEaWFsb2c6OnNwYWNpbmdIaW50KCkgKTsKKyAgICBtX2ZpbmRMYXlvdXQtPnNldE1hcmdpbigg S0RpYWxvZzo6bWFyZ2luSGludCgpICk7CisKKyAgICBtX2ZpbmRMYWJlbCA9IG5ldyBRTGFiZWwo aTE4bigiJlRleHQgVG8gRmluZCIpLCBtX2ZpbmRHcnApOworICAgIG1fZmluZCA9IG5ldyBLSGlz dG9yeUNvbWJvKHRydWUsIG1fZmluZEdycCk7CisgICAgbV9maW5kLT5zZXRNYXhDb3VudCgxMCk7 CisgICAgbV9maW5kLT5zZXREdXBsaWNhdGVzRW5hYmxlZChmYWxzZSk7CisgICAgbV9yZWdFeHAg PSBuZXcgUUNoZWNrQm94KGkxOG4oIlVzZSBQYXR0ZXJucyIpLCBtX2ZpbmRHcnApOworICAgIG1f cmVnRXhwSXRlbSA9IG5ldyBRUHVzaEJ1dHRvbihpMThuKCJJbnNlcnQgUGF0dGVybiIpLCBtX2Zp bmRHcnApOworICAgIG1fcmVnRXhwSXRlbS0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgbV9maW5k RXh0ZW5zaW9uID0gbmV3IFFXaWRnZXQobV9maW5kR3JwKTsKKworICAgIG1fZmluZExheW91dC0+ YWRkV2lkZ2V0KG1fZmluZExhYmVsLCAwLCAwKTsKKyAgICBtX2ZpbmRMYXlvdXQtPmFkZE11bHRp Q2VsbFdpZGdldChtX2ZpbmQsIDEsIDEsIDAsIDEpOworICAgIG1fZmluZExheW91dC0+YWRkV2lk Z2V0KG1fcmVnRXhwLCAyLCAwKTsKKyAgICBtX2ZpbmRMYXlvdXQtPmFkZFdpZGdldChtX3JlZ0V4 cEl0ZW0sIDIsIDEpOworICAgIG1fZmluZExheW91dC0+YWRkTXVsdGlDZWxsV2lkZ2V0KG1fZmlu ZEV4dGVuc2lvbiwgMywgMywgMCwgMSk7CisgICAgdG9wTGF5b3V0LT5hZGRXaWRnZXQobV9maW5k R3JwKTsKKworICAgIG1fcmVwbGFjZUdycCA9IG5ldyBRR3JvdXBCb3goMCwgUXQ6OlZlcnRpY2Fs LCBpMThuKCJSZXBsYWNlIFdpdGgiKSwgcGFnZSk7CisgICAgbV9yZXBsYWNlR3JwLT5sYXlvdXQo KS0+c2V0U3BhY2luZyhLRGlhbG9nOjpzcGFjaW5nSGludCgpKTsKKyAgICBtX3JlcGxhY2VHcnAt PmxheW91dCgpLT5zZXRNYXJnaW4oS0RpYWxvZzo6bWFyZ2luSGludCgpKTsKKyAgICBtX3JlcGxh Y2VMYXlvdXQgPSBuZXcgUUdyaWRMYXlvdXQobV9yZXBsYWNlR3JwLT5sYXlvdXQoKSk7CisgICAg bV9yZXBsYWNlTGF5b3V0LT5zZXRTcGFjaW5nKCBLRGlhbG9nOjpzcGFjaW5nSGludCgpICk7Cisg ICAgbV9yZXBsYWNlTGF5b3V0LT5zZXRNYXJnaW4oIEtEaWFsb2c6Om1hcmdpbkhpbnQoKSApOwor CisgICAgbV9yZXBsYWNlTGFiZWwgPSBuZXcgUUxhYmVsKGkxOG4oIiZSZXBsYWNlbWVudCBUZXh0 IiksIG1fcmVwbGFjZUdycCk7CisgICAgbV9yZXBsYWNlID0gbmV3IEtIaXN0b3J5Q29tYm8odHJ1 ZSwgbV9yZXBsYWNlR3JwKTsKKyAgICBtX3JlcGxhY2UtPnNldE1heENvdW50KDEwKTsKKyAgICBt X3JlcGxhY2UtPnNldER1cGxpY2F0ZXNFbmFibGVkKGZhbHNlKTsKKyAgICBtX2JhY2tSZWYgPSBu ZXcgUUNoZWNrQm94KGkxOG4oIiZVc2UgUGxhY2Vob2xkZXJzIiksIG1fcmVwbGFjZUdycCk7Cisg ICAgbV9iYWNrUmVmSXRlbSA9IG5ldyBRUHVzaEJ1dHRvbihpMThuKCJJbnNlcnQgUGxhY2Vob2xk ZXIiKSwgbV9yZXBsYWNlR3JwKTsKKyAgICBtX2JhY2tSZWZJdGVtLT5zZXRFbmFibGVkKGZhbHNl KTsKKyAgICBtX3JlcGxhY2VFeHRlbnNpb24gPSBuZXcgUVdpZGdldChtX3JlcGxhY2VHcnApOwor CisgICAgbV9yZXBsYWNlTGF5b3V0LT5hZGRXaWRnZXQobV9yZXBsYWNlTGFiZWwsIDAsIDApOwor ICAgIG1fcmVwbGFjZUxheW91dC0+YWRkTXVsdGlDZWxsV2lkZ2V0KG1fcmVwbGFjZSwgMSwgMSwg MCwgMSk7CisgICAgbV9yZXBsYWNlTGF5b3V0LT5hZGRXaWRnZXQobV9iYWNrUmVmLCAyLCAwKTsK KyAgICBtX3JlcGxhY2VMYXlvdXQtPmFkZFdpZGdldChtX2JhY2tSZWZJdGVtLCAyLCAxKTsKKyAg ICBtX3JlcGxhY2VMYXlvdXQtPmFkZE11bHRpQ2VsbFdpZGdldChtX3JlcGxhY2VFeHRlbnNpb24s IDMsIDMsIDAsIDEpOworICAgIHRvcExheW91dC0+YWRkV2lkZ2V0KG1fcmVwbGFjZUdycCk7CisK KyAgICBtX29wdGlvbkdycCA9IG5ldyBRR3JvdXBCb3goMCwgUXQ6OlZlcnRpY2FsLCBpMThuKCJP cHRpb25zIiksIHBhZ2UpOworICAgIG1fb3B0aW9uR3JwLT5sYXlvdXQoKS0+c2V0U3BhY2luZyhL RGlhbG9nOjpzcGFjaW5nSGludCgpKTsKKyAgICBtX29wdGlvbkdycC0+bGF5b3V0KCktPnNldE1h cmdpbihLRGlhbG9nOjptYXJnaW5IaW50KCkpOworICAgIG9wdGlvbnNMYXlvdXQgPSBuZXcgUUdy aWRMYXlvdXQobV9vcHRpb25HcnAtPmxheW91dCgpKTsKKyAgICBvcHRpb25zTGF5b3V0LT5zZXRT cGFjaW5nKCBLRGlhbG9nOjpzcGFjaW5nSGludCgpICk7CisgICAgb3B0aW9uc0xheW91dC0+c2V0 TWFyZ2luKCBLRGlhbG9nOjptYXJnaW5IaW50KCkgKTsKKworICAgIG1fY2FzZVNlbnNpdGl2ZSA9 IG5ldyBRQ2hlY2tCb3goaTE4bigiQyZhc2UgU2Vuc2l0aXZlIiksIG1fb3B0aW9uR3JwKTsKKyAg ICBtX3dob2xlV29yZHNPbmx5ID0gbmV3IFFDaGVja0JveChpMThuKCImV2hvbGUgV29yZHMgT25s eSIpLCBtX29wdGlvbkdycCk7CisgICAgbV9mcm9tQ3Vyc29yID0gbmV3IFFDaGVja0JveChpMThu KCImRnJvbSBDdXJzb3IiKSwgbV9vcHRpb25HcnApOworICAgIG1fZmluZEJhY2t3YXJkcyA9IG5l dyBRQ2hlY2tCb3goaTE4bigiRmluZCAmQmFja3dhcmRzIiksIG1fb3B0aW9uR3JwKTsKKyAgICBt X3NlbGVjdGVkVGV4dCA9IG5ldyBRQ2hlY2tCb3goaTE4bigiJlNlbGVjdGVkIFRleHQiKSwgbV9v cHRpb25HcnApOworICAgIHNldEhhc1NlbGVjdGlvbiggaGFzU2VsZWN0aW9uICk7CisgICAgbV9w cm9tcHRPblJlcGxhY2UgPSBuZXcgUUNoZWNrQm94KGkxOG4oIiZQcm9tcHQgT24gUmVwbGFjZSIp LCBtX29wdGlvbkdycCk7CisgICAgbV9wcm9tcHRPblJlcGxhY2UtPnNldENoZWNrZWQoIHRydWUg KTsKKworICAgIG9wdGlvbnNMYXlvdXQtPmFkZFdpZGdldChtX2Nhc2VTZW5zaXRpdmUsIDAsIDAp OworICAgIG9wdGlvbnNMYXlvdXQtPmFkZFdpZGdldChtX3dob2xlV29yZHNPbmx5LCAxLCAwKTsK KyAgICBvcHRpb25zTGF5b3V0LT5hZGRXaWRnZXQobV9mcm9tQ3Vyc29yLCAyLCAwKTsKKyAgICBv cHRpb25zTGF5b3V0LT5hZGRXaWRnZXQobV9maW5kQmFja3dhcmRzLCAwLCAxKTsKKyAgICBvcHRp b25zTGF5b3V0LT5hZGRXaWRnZXQobV9zZWxlY3RlZFRleHQsIDEsIDEpOworICAgIG9wdGlvbnNM YXlvdXQtPmFkZFdpZGdldChtX3Byb21wdE9uUmVwbGFjZSwgMiwgMSk7CisgICAgdG9wTGF5b3V0 LT5hZGRXaWRnZXQobV9vcHRpb25HcnApOworCisgICAgLy8gV2UgZGVsYXkgY3JlYXRpb24gb2Yg dGhlc2UgdW50aWwgbmVlZGVkLgorICAgIG1fcGF0dGVybnMgPSAwTDsKKyAgICBtX3BsYWNlaG9s ZGVycyA9IDBMOworCisgICAgLy8gc2lnbmFscyBhbmQgc2xvdHMgY29ubmVjdGlvbnMKKyAgICBj b25uZWN0KG1fc2VsZWN0ZWRUZXh0LCBTSUdOQUwodG9nZ2xlZChib29sKSksIHRoaXMsIFNMT1Qo c2xvdFNlbGVjdGVkVGV4dFRvZ2dsZWQoYm9vbCkpKTsKKyAgICBjb25uZWN0KG1fcmVnRXhwLCBT SUdOQUwodG9nZ2xlZChib29sKSksIG1fcmVnRXhwSXRlbSwgU0xPVChzZXRFbmFibGVkKGJvb2wp KSk7CisgICAgY29ubmVjdChtX2JhY2tSZWYsIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgbV9iYWNr UmVmSXRlbSwgU0xPVChzZXRFbmFibGVkKGJvb2wpKSk7CisgICAgY29ubmVjdChtX3JlZ0V4cEl0 ZW0sIFNJR05BTChwcmVzc2VkKCkpLCB0aGlzLCBTTE9UKHNob3dQYXR0ZXJucygpKSk7CisgICAg Y29ubmVjdChtX2JhY2tSZWZJdGVtLCBTSUdOQUwocHJlc3NlZCgpKSwgdGhpcywgU0xPVChzaG93 UGxhY2Vob2xkZXJzKCkpKTsKKworICAgIGNvbm5lY3QobV9maW5kLCBTSUdOQUwodGV4dENoYW5n ZWQgKCBjb25zdCBRU3RyaW5nICYgKSksdGhpcywgU0xPVCh0ZXh0U2VhcmNoQ2hhbmdlZCggY29u c3QgUVN0cmluZyAmICkpKTsKKworICAgIC8vIHRhYiBvcmRlcgorICAgIHNldFRhYk9yZGVyKG1f ZmluZCwgbV9yZWdFeHApOworICAgIHNldFRhYk9yZGVyKG1fcmVnRXhwLCBtX3JlZ0V4cEl0ZW0p OworICAgIHNldFRhYk9yZGVyKG1fcmVnRXhwSXRlbSwgbV9yZXBsYWNlKTsKKyAgICBzZXRUYWJP cmRlcihtX3JlcGxhY2UsIG1fYmFja1JlZik7CisgICAgc2V0VGFiT3JkZXIobV9iYWNrUmVmLCBt X2JhY2tSZWZJdGVtKTsKKyAgICBzZXRUYWJPcmRlcihtX2JhY2tSZWZJdGVtLCBtX2Nhc2VTZW5z aXRpdmUpOworICAgIHNldFRhYk9yZGVyKG1fY2FzZVNlbnNpdGl2ZSwgbV93aG9sZVdvcmRzT25s eSk7CisgICAgc2V0VGFiT3JkZXIobV93aG9sZVdvcmRzT25seSwgbV9mcm9tQ3Vyc29yKTsKKyAg ICBzZXRUYWJPcmRlcihtX2Zyb21DdXJzb3IsIG1fZmluZEJhY2t3YXJkcyk7CisgICAgc2V0VGFi T3JkZXIobV9maW5kQmFja3dhcmRzLCBtX3NlbGVjdGVkVGV4dCk7CisgICAgc2V0VGFiT3JkZXIo bV9zZWxlY3RlZFRleHQsIG1fcHJvbXB0T25SZXBsYWNlKTsKKworICAgIC8vIGJ1ZGRpZXMKKyAg ICBtX2ZpbmRMYWJlbC0+c2V0QnVkZHkobV9maW5kKTsKKyAgICBtX3JlcGxhY2VMYWJlbC0+c2V0 QnVkZHkobV9yZXBsYWNlKTsKKworICAgIGlmICghZm9yUmVwbGFjZSkKKyAgICB7CisgICAgICAg IG1fcHJvbXB0T25SZXBsYWNlLT5oaWRlKCk7CisgICAgICAgIG1fcmVwbGFjZUdycC0+aGlkZSgp OworICAgIH0KKyAgICBzZXRGaW5kSGlzdG9yeShmaW5kU3RyaW5ncyk7CisgICAgbV9maW5kLT5z ZXRGb2N1cygpOworICAgIGVuYWJsZUJ1dHRvbk9LKCAhZ2V0VGV4dCgpLmlzRW1wdHkoKSApOwor fQorCit2b2lkIEtFZEZpbmQ6OnRleHRTZWFyY2hDaGFuZ2VkKCBjb25zdCBRU3RyaW5nICYgdGV4 dCkKK3sKKyAgICBlbmFibGVCdXR0b25PSyggIXRleHQuaXNFbXB0eSgpICk7Cit9CisKK2xvbmcg S0VkRmluZDo6b3B0aW9ucygpIGNvbnN0Cit7CisgICAgbG9uZyBvcHRpb25zID0gMDsKKworICAg IGlmIChtX2Nhc2VTZW5zaXRpdmUtPmlzQ2hlY2tlZCgpKQorICAgICAgICBvcHRpb25zIHw9IENh c2VTZW5zaXRpdmU7CisgICAgaWYgKG1fd2hvbGVXb3Jkc09ubHktPmlzQ2hlY2tlZCgpKQorICAg ICAgICBvcHRpb25zIHw9IFdob2xlV29yZHNPbmx5OworICAgIGlmIChtX2Zyb21DdXJzb3ItPmlz Q2hlY2tlZCgpKQorICAgICAgICBvcHRpb25zIHw9IEZyb21DdXJzb3I7CisgICAgaWYgKG1fZmlu ZEJhY2t3YXJkcy0+aXNDaGVja2VkKCkpCisgICAgICAgIG9wdGlvbnMgfD0gRmluZEJhY2t3YXJk czsKKyAgICBpZiAobV9zZWxlY3RlZFRleHQtPmlzQ2hlY2tlZCgpKQorICAgICAgICBvcHRpb25z IHw9IFNlbGVjdGVkVGV4dDsKKyAgICBpZiAobV9yZWdFeHAtPmlzQ2hlY2tlZCgpKQorICAgICAg ICBvcHRpb25zIHw9IFJlZ3VsYXJFeHByZXNzaW9uOworICAgIHJldHVybiBvcHRpb25zOworfQor CitRU3RyaW5nIEtFZEZpbmQ6OmdldFRleHQoKSBjb25zdAoreworICAgIHJldHVybiBtX2ZpbmQt PmN1cnJlbnRUZXh0KCk7Cit9CisKK3ZvaWQgS0VkRmluZDo6c2V0VGV4dChRU3RyaW5nIHN0cmlu ZykKK3sKKwltX2ZpbmQtPnNldEVkaXRUZXh0KHN0cmluZyk7Cit9CisKK3ZvaWQgS0VkRmluZDo6 c2V0Q2FzZVNlbnNpdGl2ZSAoYm9vbCBjcykKK3sKKwlpZiAobV9jYXNlU2Vuc2l0aXZlKSBtX2Nh c2VTZW5zaXRpdmUtPnNldENoZWNrZWQgKGNzKTsKK30KKwordm9pZCBLRWRGaW5kOjpzZXREaXJl Y3Rpb24gKGJvb2wgZCkKK3sKKwlpZiAobV9maW5kQmFja3dhcmRzKSBtX2ZpbmRCYWNrd2FyZHMt PnNldENoZWNrZWQgKGQpOworfQorCitib29sIEtFZEZpbmQ6OmNhc2Vfc2Vuc2l0aXZlICgpIGNv bnN0Cit7CisJcmV0dXJuIChtX2Nhc2VTZW5zaXRpdmUgPyBtX2Nhc2VTZW5zaXRpdmUtPmlzQ2hl Y2tlZCgpIDogZmFsc2UpOworfQorCitib29sIEtFZEZpbmQ6OmdldF9kaXJlY3Rpb24gKCkgY29u c3QKK3sKKwlyZXR1cm4gKG1fZmluZEJhY2t3YXJkcyA/IG1fZmluZEJhY2t3YXJkcy0+aXNDaGVj a2VkKCkgOiBmYWxzZSk7Cit9CisKK3ZvaWQgS0VkRmluZDo6c2V0RmluZEhpc3RvcnkoY29uc3Qg UVN0cmluZ0xpc3QgJnN0cmluZ3MpCit7CisgICAgaWYgKHN0cmluZ3MuY291bnQoKSA+IDApCisg ICAgeworICAgICAgICBtX2ZpbmQtPnNldEhpc3RvcnlJdGVtcyhzdHJpbmdzLCB0cnVlKTsKKyAg ICAgICAgbV9maW5kLT5saW5lRWRpdCgpLT5zZXRUZXh0KCBzdHJpbmdzLmZpcnN0KCkgKTsKKyAg ICAgICAgbV9maW5kLT5saW5lRWRpdCgpLT5zZWxlY3RBbGwoKTsKKyAgICB9CisgICAgZWxzZQor ICAgICAgICBtX2ZpbmQtPmNsZWFySGlzdG9yeSgpOworfQorCit2b2lkIEtFZEZpbmQ6OnNldEhh c1NlbGVjdGlvbihib29sIGhhc1NlbGVjdGlvbikKK3sKKyAgICBtX3NlbGVjdGVkVGV4dC0+c2V0 RW5hYmxlZCggaGFzU2VsZWN0aW9uICk7CisgICAgLy8gSWYgd2UgaGF2ZSBhIHNlbGVjdGlvbiwg d2UgbWFrZSAnZmluZCBpbiBzZWxlY3Rpb24nIGRlZmF1bHQKKyAgICAvLyBhbmQgaWYgd2UgZG9u J3QsIHRoZW4gdGhlIG9wdGlvbiBoYXMgdG8gYmUgdW5jaGVja2VkLCBvYnZpb3VzbHkuCisgICAg bV9zZWxlY3RlZFRleHQtPnNldENoZWNrZWQoIGhhc1NlbGVjdGlvbiApOworICAgIHNsb3RTZWxl Y3RlZFRleHRUb2dnbGVkKCBoYXNTZWxlY3Rpb24gKTsKK30KKwordm9pZCBLRWRGaW5kOjpzbG90 U2VsZWN0ZWRUZXh0VG9nZ2xlZChib29sIHNlbGVjKQoreworICAgIC8vIEZyb20gY3Vyc29yIGRv ZXNuJ3QgbWFrZSBzZW5zZSBpZiB3ZSBoYXZlIGEgc2VsZWN0aW9uCisgICAgbV9mcm9tQ3Vyc29y LT5zZXRFbmFibGVkKCAhc2VsZWMgKTsKKyAgICBpZiAoIHNlbGVjICkgLy8gdW5jaGVjayBpZiBk aXNhYmxlZAorICAgICAgICBtX2Zyb21DdXJzb3ItPnNldENoZWNrZWQoIGZhbHNlICk7Cit9CisK K3ZvaWQgS0VkRmluZDo6c2V0T3B0aW9ucyhsb25nIG9wdGlvbnMpCit7CisgICAgbV9jYXNlU2Vu c2l0aXZlLT5zZXRDaGVja2VkKG9wdGlvbnMgJiBDYXNlU2Vuc2l0aXZlKTsKKyAgICBtX3dob2xl V29yZHNPbmx5LT5zZXRDaGVja2VkKG9wdGlvbnMgJiBXaG9sZVdvcmRzT25seSk7CisgICAgbV9m cm9tQ3Vyc29yLT5zZXRDaGVja2VkKG9wdGlvbnMgJiBGcm9tQ3Vyc29yKTsKKyAgICBtX2ZpbmRC YWNrd2FyZHMtPnNldENoZWNrZWQob3B0aW9ucyAmIEZpbmRCYWNrd2FyZHMpOworICAgIG1fc2Vs ZWN0ZWRUZXh0LT5zZXRDaGVja2VkKG9wdGlvbnMgJiBTZWxlY3RlZFRleHQpOworICAgIG1fcmVn RXhwLT5zZXRDaGVja2VkKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbik7Cit9CisKKy8vIENy ZWF0ZSBhIHBvcHVwIG1lbnUgd2l0aCBhIGxpc3Qgb2YgcmVndWxhciBleHByZXNzaW9uIHRlcm1z LCB0byBoZWxwIHRoZSB1c2VyCisvLyBjb21wb3NlIGEgcmVndWxhciBleHByZXNzaW9uIHNlYXJj aCBwYXR0ZXJuLgordm9pZCBLRWRGaW5kOjpzaG93UGF0dGVybnMoKQoreworICAgIHR5cGVkZWYg c3RydWN0CisgICAgeworICAgICAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKKyAgICAgICAg Y29uc3QgY2hhciAqcmVnRXhwOworICAgICAgICBpbnQgY3Vyc29yQWRqdXN0bWVudDsKKyAgICB9 IHRlcm07CisgICAgc3RhdGljIGNvbnN0IHRlcm0gaXRlbXNbXSA9CisgICAgeworICAgICAgICB7 IEkxOE5fTk9PUCgiQW55IENoYXJhY3RlciIpLCAgICAgICAgICAgICAgICAgIi4iLCAgICAgICAg MCB9LAorICAgICAgICB7IEkxOE5fTk9PUCgiU3RhcnQgb2YgTGluZSIpLCAgICAgICAgICAgICAg ICAgIl4iLCAgICAgICAgMCB9LAorICAgICAgICB7IEkxOE5fTk9PUCgiRW5kIG9mIExpbmUiKSwg ICAgICAgICAgICAgICAgICAgIiQiLCAgICAgICAgMCB9LAorICAgICAgICB7IEkxOE5fTk9PUCgi U2V0IG9mIENoYXJhY3RlcnMiKSwgICAgICAgICAgICAgIltdIiwgICAgICAgLTEgfSwKKyAgICAg ICAgeyBJMThOX05PT1AoIlJlcGVhdHMsIHplcm8gb3IgbW9yZSB0aW1lcyIpLCAgICIqIiwgICAg ICAgIDAgfSwKKyAgICAgICAgeyBJMThOX05PT1AoIlJlcGVhdHMsIG9uZSBvciBtb3JlIHRpbWVz IiksICAgICIrIiwgICAgICAgIDAgfSwKKyAgICAgICAgeyBJMThOX05PT1AoIk9wdGlvbmFsIiks ICAgICAgICAgICAgICAgICAgICAgICI/IiwgICAgICAgIDAgfSwKKyAgICAgICAgeyBJMThOX05P T1AoIkVzY2FwZSIpLCAgICAgICAgICAgICAgICAgICAgICAgICJcXCIsICAgICAgIDAgfSwKKyAg ICAgICAgeyBJMThOX05PT1AoIlRBQiIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXHQi LCAgICAgIDAgfSwKKyAgICAgICAgeyBJMThOX05PT1AoIk5MIiksICAgICAgICAgICAgICAgICAg ICAgICAgICAgICJcXG4iLCAgICAgIDAgfSwKKyAgICAgICAgeyBJMThOX05PT1AoIkNSIiksICAg ICAgICAgICAgICAgICAgICAgICAgICAgICJcXHIiLCAgICAgIDAgfSwKKyAgICAgICAgeyBJMThO X05PT1AoIldoaXRlIFNwYWNlIiksICAgICAgICAgICAgICAgICAgICJcXHMiLCAgICAgIDAgfSwK KyAgICAgICAgeyBJMThOX05PT1AoIkRpZ2l0IiksICAgICAgICAgICAgICAgICAgICAgICAgICJc XGQiLCAgICAgIDAgfSwKKyAgICAgICAgeyBJMThOX05PT1AoIlVuaWNvZGUgcG9pbnQiKSwgICAg ICAgICAgICAgICAgICJceDAwMDAiLCAgIDAgfSwKKyAgICAgICAgeyBJMThOX05PT1AoIkFTQ0lJ L0xhdGluLTEgY2hhcmFjdGVyIiksICAgICAgICJcMDAwIiwgICAgIDAgfQorICAgIH07CisgICAg aW50IGk7CisKKyAgICAvLyBQb3B1bGF0ZSB0aGUgcG9wdXAgbWVudS4KKyAgICBpZiAoIW1fcGF0 dGVybnMpCisgICAgeworICAgICAgICBtX3BhdHRlcm5zID0gbmV3IFFQb3B1cE1lbnUodGhpcyk7 CisgICAgICAgIGZvciAoaSA9IDA7ICh1bnNpZ25lZClpIDwgc2l6ZW9mKGl0ZW1zKSAvIHNpemVv ZihpdGVtc1swXSk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbV9wYXR0ZXJucy0+aW5z ZXJ0SXRlbShpMThuKGl0ZW1zW2ldLmRlc2NyaXB0aW9uKSwgaSwgaSk7CisgICAgICAgIH0KKyAg ICB9CisKKyAgICAvLyBJbnNlcnQgdGhlIHNlbGVjdGlvbiBpbnRvIHRoZSBlZGl0IGNvbnRyb2wu CisgICAgaSA9IG1fcGF0dGVybnMtPmV4ZWMoUUN1cnNvcjo6cG9zKCkpOworICAgIGlmIChpICE9 IC0xKQorICAgIHsKKyAgICAgICAgUUxpbmVFZGl0ICplZGl0b3IgPSBtX2ZpbmQtPmxpbmVFZGl0 KCk7CisKKyAgICAgICAgZWRpdG9yLT5pbnNlcnQoaXRlbXNbaV0ucmVnRXhwKTsKKyAgICAgICAg ZWRpdG9yLT5zZXRDdXJzb3JQb3NpdGlvbihlZGl0b3ItPmN1cnNvclBvc2l0aW9uKCkgKyBpdGVt c1tpXS5jdXJzb3JBZGp1c3RtZW50KTsKKyAgICB9Cit9CisKKy8vIENyZWF0ZSBhIHBvcHVwIG1l bnUgd2l0aCBhIGxpc3Qgb2YgYmFja3JlZmVyZW5jZSB0ZXJtcywgdG8gaGVscCB0aGUgdXNlcgor Ly8gY29tcG9zZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiByZXBsYWNlbWVudCBwYXR0ZXJuLgordm9p ZCBLRWRGaW5kOjpzaG93UGxhY2Vob2xkZXJzKCkKK3sKKyAgICB0eXBlZGVmIHN0cnVjdAorICAg IHsKKyAgICAgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb247CisgICAgICAgIGNvbnN0IGNoYXIg KmJhY2tSZWY7CisgICAgfSB0ZXJtOworICAgIHN0YXRpYyBjb25zdCB0ZXJtIGl0ZW1zW10gPQor ICAgIHsKKyAgICAgICAgeyBJMThOX05PT1AoIkNvbXBsZXRlIHRleHQgZm91bmQiKSwgICAgICAg ICAgICAgIi8wIiB9LAorICAgIH07CisgICAgaW50IGk7CisKKyAgICAvLyBQb3B1bGF0ZSB0aGUg cG9wdXAgbWVudS4KKyAgICBpZiAoIW1fcGxhY2Vob2xkZXJzKQorICAgIHsKKyAgICAgICAgbV9w bGFjZWhvbGRlcnMgPSBuZXcgUVBvcHVwTWVudSh0aGlzKTsKKyAgICAgICAgZm9yIChpID0gMDsg KHVuc2lnbmVkKWkgPCBzaXplb2YoaXRlbXMpIC8gc2l6ZW9mKGl0ZW1zWzBdKTsgaSsrKQorICAg ICAgICB7CisgICAgICAgICAgICBtX3BsYWNlaG9sZGVycy0+aW5zZXJ0SXRlbShpMThuKGl0ZW1z W2ldLmRlc2NyaXB0aW9uKSwgaSwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbnNl cnQgdGhlIHNlbGVjdGlvbiBpbnRvIHRoZSBlZGl0IGNvbnRyb2wuCisgICAgaSA9IG1fcGxhY2Vo b2xkZXJzLT5leGVjKFFDdXJzb3I6OnBvcygpKTsKKyAgICBpZiAoaSAhPSAtMSkKKyAgICB7Cisg ICAgICAgIFFMaW5lRWRpdCAqZWRpdG9yID0gbV9yZXBsYWNlLT5saW5lRWRpdCgpOworCisgICAg ICAgIGVkaXRvci0+aW5zZXJ0KGl0ZW1zW2ldLmJhY2tSZWYpOworICAgIH0KK30KKwordm9pZCBL RWRGaW5kOjpzbG90T2soKQoreworICAgIC8vIE5vdGhpbmcgdG8gZmluZD8KKyAgICBpZiAoZ2V0 VGV4dCgpLmlzRW1wdHkoKSkKKyAgICB7CisgICAgICAgIEtNZXNzYWdlQm94OjplcnJvcih0aGlz LCBpMThuKCJZb3UgbXVzdCBlbnRlciBzb21lIHRleHQgdG8gc2VhcmNoIGZvci4iKSk7CisgICAg ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobV9yZWdFeHAtPmlzQ2hlY2tlZCgpKQorICAg IHsKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uLgorICAg ICAgICBRUmVnRXhwIHJlZ0V4cChnZXRUZXh0KCkpOworCisgICAgICAgIGlmICghcmVnRXhwLmlz VmFsaWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgS01lc3NhZ2VCb3g6OmVycm9yKHRoaXMs IGkxOG4oIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uLiIpKTsKKyAgICAgICAgICAgIHJldHVy bjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtX2ZpbmQtPmFkZFRvSGlzdG9yeShnZXRUZXh0KCkp OworICAgIGVtaXQgb2tDbGlja2VkKCk7CisgICAgYWNjZXB0KCk7Cit9CisKKy8vIENyZWF0ZSB0 aGUgZGlhbG9nLgorS0VkRmluZE5leHQ6OktFZEZpbmROZXh0KGNvbnN0IFFTdHJpbmcgJnBhdHRl cm4sIGxvbmcgb3B0aW9ucywgUVdpZGdldCAqcGFyZW50KSA6CisgICAgS0RpYWxvZ0Jhc2UocGFy ZW50LCBfX0ZJTEVfXywgZmFsc2UsICAvLyBub24tbW9kYWwhCisgICAgICAgIGkxOG4oIkZpbmQi KSwKKyAgICAgICAgVXNlcjEgfCBDbG9zZSwKKyAgICAgICAgVXNlcjEsCisgICAgICAgIGZhbHNl LAorICAgICAgICBpMThuKCImWWVzIikpCit7CisgICAgc2V0TWFpbldpZGdldCggbmV3IFFMYWJl bCggaTE4bigiRmluZCBuZXh0ICclMSciKS5hcmcocGF0dGVybiksIHRoaXMgKSApOworCisgICAg bV9jYW5jZWxsZWQgPSBmYWxzZTsKKyAgICBtX29wdGlvbnMgPSBvcHRpb25zOworICAgIG1fcGFy ZW50ID0gcGFyZW50OworICAgIG1fbWF0Y2hlcyA9IDA7CisgICAgaWYgKG1fb3B0aW9ucyAmIEtF ZEZpbmQ6OlJlZ3VsYXJFeHByZXNzaW9uKQorICAgICAgICBtX3JlZ0V4cCA9IG5ldyBRUmVnRXhw KHBhdHRlcm4sIG1fb3B0aW9ucyAmIEtFZEZpbmQ6OkNhc2VTZW5zaXRpdmUpOworICAgIGVsc2UK KyAgICAgICAgbV9wYXR0ZXJuID0gcGF0dGVybjsKKyAgICByZXNpemUobWluaW11bVNpemUoKSk7 Cit9CisKK0tFZEZpbmROZXh0Ojp+S0VkRmluZE5leHQoKQoreworICAgIGlmICghbV9tYXRjaGVz ICYmICFtX2NhbmNlbGxlZCkKKyAgICAgICAgS01lc3NhZ2VCb3g6OmluZm9ybWF0aW9uKG1fcGFy ZW50LCBpMThuKCJObyBtYXRjaCB3YXMgZm91bmQuIikpOworfQorCit2b2lkIEtFZEZpbmROZXh0 OjpzbG90Q2xvc2UoKQoreworICAgIG1fY2FuY2VsbGVkID0gdHJ1ZTsKKyAgICBrYXBwLT5leGl0 X2xvb3AoKTsKK30KKwordm9pZCBLRWRGaW5kTmV4dDo6YWJvcnQoKQoreworICAgIHNsb3RDbG9z ZSgpOworfQorCitib29sIEtFZEZpbmROZXh0OjpmaW5kKGNvbnN0IFFTdHJpbmcgJnRleHQsIGNv bnN0IFFSZWN0ICZleHBvc2UpCit7CisgICAgaWYgKG1fb3B0aW9ucyAmIEtFZEZpbmQ6OkZpbmRC YWNrd2FyZHMpCisgICAgeworICAgICAgICBtX2luZGV4ID0gdGV4dC5sZW5ndGgoKTsKKyAgICB9 CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbV9pbmRleCA9IDA7CisgICAgfQorICAgIG1fdGV4 dCA9IHRleHQ7CisgICAgbV9leHBvc2UgPSBleHBvc2U7CisgICAgZG8KKyAgICB7CisgICAgICAg IC8vIEZpbmQgdGhlIG5leHQgbWF0Y2guCisgICAgICAgIGlmIChtX29wdGlvbnMgJiBLRWRGaW5k OjpSZWd1bGFyRXhwcmVzc2lvbikKKyAgICAgICAgICAgIG1faW5kZXggPSBLRWRGaW5kTmV4dDo6 ZmluZChtX3RleHQsICptX3JlZ0V4cCwgbV9pbmRleCwgbV9vcHRpb25zLCAmbV9tYXRjaGVkTGVu Z3RoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbV9pbmRleCA9IEtFZEZpbmROZXh0Ojpm aW5kKG1fdGV4dCwgbV9wYXR0ZXJuLCBtX2luZGV4LCBtX29wdGlvbnMsICZtX21hdGNoZWRMZW5n dGgpOworICAgICAgICBpZiAobV9pbmRleCAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAg Ly8gVGVsbCB0aGUgd29ybGQgYWJvdXQgdGhlIG1hdGNoIHdlIGZvdW5kLCBpbiBjYXNlIHNvbWVv bmUgd2FudHMgdG8KKyAgICAgICAgICAgIC8vIGhpZ2hsaWdodCBpdC4KKyAgICAgICAgICAgIGVt aXQgaGlnaGxpZ2h0KG1fdGV4dCwgbV9pbmRleCwgbV9tYXRjaGVkTGVuZ3RoLCBtX2V4cG9zZSwg bV9vcHRpb25zKTsKKyAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgICAgIGthcHAtPmVudGVy X2xvb3AoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoKG1faW5kZXggIT0gLTEpICYm ICFtX2NhbmNlbGxlZCk7CisKKyAgICAvLyBTaG91bGQgdGhlIHVzZXIgY29udGludWU/CisgICAg cmV0dXJuICFtX2NhbmNlbGxlZDsKK30KKworaW50IEtFZEZpbmROZXh0OjpmaW5kKGNvbnN0IFFT dHJpbmcgJnRleHQsIGNvbnN0IFFTdHJpbmcgJnBhdHRlcm4sIGludCBpbmRleCwgbG9uZyBvcHRp b25zLCBpbnQgKm1hdGNoZWRMZW5ndGgpCit7CisgICAgLy8gSGFuZGxlIHJlZ3VsYXIgZXhwcmVz c2lvbnMgaW4gdGhlIGFwcHJvcHJpYXRlIHdheS4KKyAgICBpZiAob3B0aW9ucyAmIEtFZEZpbmQ6 OlJlZ3VsYXJFeHByZXNzaW9uKQorICAgIHsKKyAgICAgICAgUVJlZ0V4cCByZWdFeHAocGF0dGVy biwgb3B0aW9ucyAmIEtFZEZpbmQ6OkNhc2VTZW5zaXRpdmUpOworCisgICAgICAgIHJldHVybiBm aW5kKHRleHQsIHJlZ0V4cCwgaW5kZXgsIG9wdGlvbnMsIG1hdGNoZWRMZW5ndGgpOworICAgIH0K KworICAgIGJvb2wgY2FzZVNlbnNpdGl2ZSA9IChvcHRpb25zICYgS0VkRmluZDo6Q2FzZVNlbnNp dGl2ZSk7CisKKyAgICBpZiAob3B0aW9ucyAmIEtFZEZpbmQ6Oldob2xlV29yZHNPbmx5KQorICAg IHsKKyAgICAgICAgaWYgKG9wdGlvbnMgJiBLRWRGaW5kOjpGaW5kQmFja3dhcmRzKQorICAgICAg ICB7CisgICAgICAgICAgICAvLyBCYWNrd2FyZCBzZWFyY2gsIHVudGlsIHRoZSBiZWdpbm5pbmcg b2YgdGhlIGxpbmUuLi4KKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA+PSAwKQorICAgICAgICAg ICAgeworICAgICAgICAgICAgICAgIC8vIC4uLmZpbmQgdGhlIG5leHQgbWF0Y2guCisgICAgICAg ICAgICAgICAgaW5kZXggPSB0ZXh0LmZpbmRSZXYocGF0dGVybiwgaW5kZXgsIGNhc2VTZW5zaXRp dmUpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICAg ICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyBJcyB0aGUgbWF0Y2ggZGVsaW1pdGVkIGNv cnJlY3RseT8KKyAgICAgICAgICAgICAgICAqbWF0Y2hlZExlbmd0aCA9IHBhdHRlcm4ubGVuZ3Ro KCk7CisgICAgICAgICAgICAgICAgaWYgKGlzV2hvbGVXb3Jkcyh0ZXh0LCBpbmRleCwgKm1hdGNo ZWRMZW5ndGgpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBp bmRleC0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAg eworICAgICAgICAgICAgLy8gRm9yd2FyZCBzZWFyY2gsIHVudGlsIHRoZSBlbmQgb2YgdGhlIGxp bmUuLi4KKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IChpbnQpdGV4dC5sZW5ndGgoKSkKKyAg ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAuLi5maW5kIHRoZSBuZXh0IG1hdGNoLgor ICAgICAgICAgICAgICAgIGluZGV4ID0gdGV4dC5maW5kKHBhdHRlcm4sIGluZGV4LCBjYXNlU2Vu c2l0aXZlKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpCisgICAgICAgICAgICAg ICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gSXMgdGhlIG1hdGNoIGRlbGltaXRl ZCBjb3JyZWN0bHk/CisgICAgICAgICAgICAgICAgKm1hdGNoZWRMZW5ndGggPSBwYXR0ZXJuLmxl bmd0aCgpOworICAgICAgICAgICAgICAgIGlmIChpc1dob2xlV29yZHModGV4dCwgaW5kZXgsICpt YXRjaGVkTGVuZ3RoKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg ICAgaW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisg ICAgeworICAgICAgICAvLyBOb24td2hvbGUtd29yZCBzZWFyY2guCisgICAgICAgIGlmIChvcHRp b25zICYgS0VkRmluZDo6RmluZEJhY2t3YXJkcykKKyAgICAgICAgeworICAgICAgICAgICAgaW5k ZXggPSB0ZXh0LmZpbmRSZXYocGF0dGVybiwgaW5kZXgsIGNhc2VTZW5zaXRpdmUpOworICAgICAg ICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZXggPSB0ZXh0LmZp bmQocGF0dGVybiwgaW5kZXgsIGNhc2VTZW5zaXRpdmUpOworICAgICAgICB9CisgICAgICAgIGlm IChpbmRleCAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgKm1hdGNoZWRMZW5ndGggPSBw YXR0ZXJuLmxlbmd0aCgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbmRleDsKK30K KworaW50IEtFZEZpbmROZXh0OjpmaW5kKGNvbnN0IFFTdHJpbmcgJnRleHQsIGNvbnN0IFFSZWdF eHAgJnBhdHRlcm4sIGludCBpbmRleCwgbG9uZyBvcHRpb25zLCBpbnQgKm1hdGNoZWRMZW5ndGgp Cit7CisgICAgaWYgKG9wdGlvbnMgJiBLRWRGaW5kOjpXaG9sZVdvcmRzT25seSkKKyAgICB7Cisg ICAgICAgIGlmIChvcHRpb25zICYgS0VkRmluZDo6RmluZEJhY2t3YXJkcykKKyAgICAgICAgewor ICAgICAgICAgICAgLy8gQmFja3dhcmQgc2VhcmNoLCB1bnRpbCB0aGUgYmVnaW5uaW5nIG9mIHRo ZSBsaW5lLi4uCisgICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkKKyAgICAgICAgICAgIHsK KyAgICAgICAgICAgICAgICAvLyAuLi5maW5kIHRoZSBuZXh0IG1hdGNoLgorICAgICAgICAgICAg ICAgIGluZGV4ID0gdGV4dC5maW5kUmV2KHBhdHRlcm4sIGluZGV4KTsKKyAgICAgICAgICAgICAg ICBpZiAoaW5kZXggPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAg ICAgICAgICAgLy8gSXMgdGhlIG1hdGNoIGRlbGltaXRlZCBjb3JyZWN0bHk/CisgICAgICAgICAg ICAgICAgcGF0dGVybi5tYXRjaCh0ZXh0LCBpbmRleCwgbWF0Y2hlZExlbmd0aCwgZmFsc2UpOwor ICAgICAgICAgICAgICAgIGlmIChpc1dob2xlV29yZHModGV4dCwgaW5kZXgsICptYXRjaGVkTGVu Z3RoKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaW5kZXgt LTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAg ICAgICAgICAgIC8vIEZvcndhcmQgc2VhcmNoLCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lLi4u CisgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCAoaW50KXRleHQubGVuZ3RoKCkpCisgICAgICAg ICAgICB7CisgICAgICAgICAgICAgICAgLy8gLi4uZmluZCB0aGUgbmV4dCBtYXRjaC4KKyAgICAg ICAgICAgICAgICBpbmRleCA9IHRleHQuZmluZChwYXR0ZXJuLCBpbmRleCk7CisgICAgICAgICAg ICAgICAgaWYgKGluZGV4ID09IC0xKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAg ICAgICAgICAgICAgIC8vIElzIHRoZSBtYXRjaCBkZWxpbWl0ZWQgY29ycmVjdGx5PworICAgICAg ICAgICAgICAgIHBhdHRlcm4ubWF0Y2godGV4dCwgaW5kZXgsIG1hdGNoZWRMZW5ndGgsIGZhbHNl KTsKKyAgICAgICAgICAgICAgICBpZiAoaXNXaG9sZVdvcmRzKHRleHQsIGluZGV4LCAqbWF0Y2hl ZExlbmd0aCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlu ZGV4Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsK KyAgICAgICAgLy8gTm9uLXdob2xlLXdvcmQgc2VhcmNoLgorICAgICAgICBpZiAob3B0aW9ucyAm IEtFZEZpbmQ6OkZpbmRCYWNrd2FyZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4ID0g dGV4dC5maW5kUmV2KHBhdHRlcm4sIGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisg ICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4ID0gdGV4dC5maW5kKHBhdHRlcm4sIGluZGV4KTsK KyAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAg ICAgIHBhdHRlcm4ubWF0Y2godGV4dCwgaW5kZXgsIG1hdGNoZWRMZW5ndGgsIGZhbHNlKTsKKyAg ICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5kZXg7Cit9CisKK2Jvb2wgS0VkRmluZE5leHQ6 OmlzSW5Xb3JkKFFDaGFyIGNoKQoreworICAgIHJldHVybiBjaC5pc0xldHRlcigpIHx8IGNoLmlz RGlnaXQoKSB8fCBjaCA9PSAnXyc7Cit9CisKK2Jvb2wgS0VkRmluZE5leHQ6OmlzV2hvbGVXb3Jk cyhjb25zdCBRU3RyaW5nICZ0ZXh0LCBpbnQgc3RhcnRzLCBpbnQgbWF0Y2hlZExlbmd0aCkKK3sK KyAgICBpZiAoKHN0YXJ0cyA9PSAwKSB8fCAoIWlzSW5Xb3JkKHRleHRbc3RhcnRzIC0gMV0pKSkK KyAgICB7CisgICAgICAgIGludCBlbmRzID0gc3RhcnRzICsgbWF0Y2hlZExlbmd0aDsKKworICAg ICAgICBpZiAoKGVuZHMgPT0gKGludCl0ZXh0Lmxlbmd0aCgpKSB8fCAoIWlzSW5Xb3JkKHRleHRb ZW5kc10pKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFs c2U7Cit9CisKKy8vIFllcy4KK3ZvaWQgS0VkRmluZE5leHQ6OnNsb3RVc2VyMSgpCit7CisgICAg bV9tYXRjaGVzKys7CisgICAgaWYgKG1fb3B0aW9ucyAmIEtFZEZpbmQ6OkZpbmRCYWNrd2FyZHMp CisgICAgICAgIG1faW5kZXgtLTsKKyAgICBlbHNlCisgICAgICAgIG1faW5kZXgrKzsKKyAgICBr YXBwLT5leGl0X2xvb3AoKTsKK30KKworI2luY2x1ZGUgImtlZGZpbmQubW9jIgpJbmRleDoga2Vk ZmluZC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IGtlZGZpbmQuaApkaWZmIC1OIGtlZGZpbmQuaAot LS0gL2Rldi9udWxsCVR1ZSBNYXkgIDUgMjA6MzI6MjcgMTk5OAorKysga2VkZmluZC5oCVNhdCBO b3YgMTcgMjM6NDI6MDYgMjAwMQpAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAgICBDb3B5cmlnaHQg KEMpIDIwMDEsIFMuUi5IYXF1ZSA8c3JoYXF1ZUBpZWUub3JnPi4KKyAgICBUaGlzIGZpbGUgaXMg cGFydCBvZiB0aGUgS0RFIHByb2plY3QKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAg IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0 aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0 aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9y IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJy YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBz aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi bGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgICBCb3N0b24sIE1B IDAyMTExLTEzMDcsIFVTQS4KKyovCisKKyNpZm5kZWYgS0VERklORF9ICisjZGVmaW5lIEtFREZJ TkRfSAorCisjaW5jbHVkZSA8a2RpYWxvZ2Jhc2UuaD4KKworY2xhc3MgS0hpc3RvcnlDb21ibzsK K2NsYXNzIFFDaGVja0JveDsKK2NsYXNzIFFHcm91cEJveDsKK2NsYXNzIFFMYWJlbDsKK2NsYXNz IFFQb3B1cE1lbnU7CitjbGFzcyBRUHVzaEJ1dHRvbjsKK2NsYXNzIFFSZWN0OworY2xhc3MgUUdy aWRMYXlvdXQ7CisKKy8qKgorICogQHNob3J0IEEgZ2VuZXJpYyAiZmluZCIgd2lkZ2V0LgorICoK KyAqIEBhdXRob3IgUy5SLkhhcXVlIDxzcmhhcXVlQGllZS5vcmc+CisgKgorICogQHNlY3QgRGV0 YWlsCisgKgorICogVGhpcyB3aWRnZXQgaW5oZXJpdHMgZnJvbSBAcmVmIEtEaWFsb2dCYXNlIGFu ZCBpbXBsZW1lbnRzCisgKiB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0aWVz OiAgYSBmaW5kIHN0cmluZworICogb2JqZWN0IGFuZCBhbiBhcmVhIGZvciBhIHVzZXItZGVmaW5l ZCB3aWRnZXQgdG8gZXh0ZW5kIHRoZSBkaWFsb2cuCisgKgorICogQHNlY3QgRXhhbXBsZQorICoK KyAqIFRvIHVzZSB0aGUgYmFzaWMgZmluZCBkaWFsb2c6CisgKgorICogPHByZT4KKyAqICBLRWRG aW5kIGRsZyguLi4uKQorICogIGlmICggZGxnLmV4ZWMoKSAhPSBRRGlhbG9nOjpBY2NlcHRlZCAp CisgKiAgICAgIHJldHVybjsKKyAqCisgKiAgLy8gcHJvY2VlZCB3aXRoIEtFZEZpbmROZXh0IGZy b20gaGVyZQorICogPC9wcmU+CisgKgorICogVG8gdXNlIHlvdXIgb3duIGV4dGVuc2lvbnM6Cisg KgorICogPHByZT4KKyAqIDwvcHJlPgorICovCisKK2NsYXNzIEtFZEZpbmQ6CisgICAgcHVibGlj IEtEaWFsb2dCYXNlCit7CisgICAgUV9PQkpFQ1QKKworcHVibGljOgorCisgICAgLy8gT3B0aW9u cy4KKworICAgIHR5cGVkZWYgZW51bQorICAgIHsKKyAgICAgICAgV2hvbGVXb3Jkc09ubHkgPSAx LCAgICAgLy8gTWF0Y2ggd2hvbGUgd29yZHMgb25seS4KKyAgICAgICAgRnJvbUN1cnNvciA9IDIs ICAgICAgICAgLy8gU3RhcnQgZnJvbSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi4KKyAgICAgICAg U2VsZWN0ZWRUZXh0ID0gNCwgICAgICAgLy8gT25seSBzZWFyY2ggc2VsZWN0ZWQgYXJlYS4KKyAg ICAgICAgQ2FzZVNlbnNpdGl2ZSA9IDgsICAgICAgLy8gQ29uc2lkZXIgY2FzZSB3aGVuIG1hdGNo aW5nLgorICAgICAgICBGaW5kQmFja3dhcmRzID0gMTYsICAgICAvLyBHbyBiYWNrd2FyZHMuCisg ICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uID0gMzIsIC8vIEludGVycHJldCB0aGUgcGF0dGVybiBh cyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAgLy8gVXNlciBleHRlbnNpb25zIGNhbiB1 c2UgYm9vbGVhbiBvcHRpb25zIGFib3ZlIHRoaXMgdmFsdWUuCisgICAgICAgIE1pbmltdW1Vc2Vy T3B0aW9uID0gNjU1MzYKKyAgICB9IE9wdGlvbnM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1 Y3QgYSBmaW5kIGRpYWxvZyB3aXRoIGEgcGFyZW50IG9iamVjdCBhbmQgYSBuYW1lLgorICAgICAq CisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9iamVjdCBvZiB0aGlzIHdpZGdldC4K KyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHdpZGdldC4KKyAgICAgKiBAcGFy YW0gb3B0aW9ucyBBIGJpdGZpZWxkIG9mIHRoZSBAcmVmIE9wdGlvbnMgdG8gYmUgZW5hYmxlZC4K KyAgICAgKiBAcGFyYW0gZmluZFN0cmluZ3MgVGhlIGZpbmQgaGlzdG9yeSwgQHNlZSBmaW5kSGlz dG9yeSgpCisgICAgICogQHBhcmFtIGhhc1NlbGVjdGlvbiBXaGV0aGVyIGEgc2VsZWN0aW9uIGV4 aXN0cworICAgICAqLworICAgIEtFZEZpbmQoIFFXaWRnZXQgKnBhcmVudCA9IDAsIGNvbnN0IGNo YXIgKm5hbWUgPSAwLCBsb25nIG9wdGlvbnMgPSAwLAorICAgICAgICAgICAgICAgICAgY29uc3Qg UVN0cmluZ0xpc3QgJmZpbmRTdHJpbmdzID0gUVN0cmluZ0xpc3QoKSwgYm9vbCBoYXNTZWxlY3Rp b24gPSB0cnVlICk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdG9yLgorICAgICAqLworICAg IHZpcnR1YWwgfktFZEZpbmQoKTsKKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgdGhlIGxpc3Qg b2YgQHAgc3RyaW5ncyB0byBiZSBkaXNwbGF5ZWQgYXMgdGhlIGhpc3RvcnkKKyAgICAgKiBvZiBm aW5kIHN0cmluZ3MuIEBwIHN0cmluZ3MgbWlnaHQgZ2V0IHRydW5jYXRlZCBpZiBpdCBpcworICAg ICAqIHRvbyBsb25nLgorICAgICAqCisgICAgICogQHBhcmFtIGhpc3RvcnkgVGhlIGZpbmQgaGlz dG9yeS4KKyAgICAgKiBAc2VlICNmaW5kSGlzdG9yeQorICAgICAqLworICAgIHZvaWQgc2V0Rmlu ZEhpc3RvcnkoIGNvbnN0IFFTdHJpbmdMaXN0ICZzdHJpbmdzICk7CisKKyAgICAvKioKKyAgICAg KiBSZXR1cm5zIHRoZSBsaXN0IG9mIGhpc3RvcnkgaXRlbXMuCisgICAgICoKKyAgICAgKiBAc2Vl ICNzZXRGaW5kSGlzdG9yeQorICAgICAqLworICAgIFFTdHJpbmdMaXN0IGZpbmRIaXN0b3J5KCkg Y29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUvZGlzYWJsZSB0aGUgJ3NlYXJjaCBpbiBz ZWxlY3Rpb24nIG9wdGlvbiwgZGVwZW5kaW5nCisgICAgICogb24gd2hldGhlciB0aGVyZSBhY3R1 YWxseSBpcyBhIHNlbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYXNTZWxlY3Rpb24g dHJ1ZSBpZiBhIHNlbGVjdGlvbiBleGlzdHMKKyAgICAgKi8KKyAgICB2b2lkIHNldEhhc1NlbGVj dGlvbiggYm9vbCBoYXNTZWxlY3Rpb24gKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3B0 aW9ucyB3aGljaCBhcmUgZW5hYmxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHRpb25zIFRo ZSBzZXR0aW5nIG9mIHRoZSBAcmVmIE9wdGlvbnMuCisgICAgICovCisgICAgdm9pZCBzZXRPcHRp b25zKCBsb25nIG9wdGlvbnMgKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0YXRl IG9mIHRoZSBvcHRpb25zLiBEaXNhYmxlZCBvcHRpb25zIG1heSBiZSByZXR1cm5lZCBpbgorICAg ICAqIGFuIGluZGV0ZXJtaW5hdGUgc3RhdGUuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRPcHRp b25zCisgICAgICovCisgICAgbG9uZyBvcHRpb25zKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAg KiBSZXR1cm5zIHRoZSBwYXR0ZXJuIHRvIGZpbmQuCisgICAgICovCisgICAgUVN0cmluZyBnZXRU ZXh0KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHdpZGdldCB3 aGljaCB0aGUgdXNlciBtYXkgZmlsbCB3aXRoIGFkZGl0aW9uYWwgVUkKKyAgICAgKiBlbGVtZW50 cyBhcyByZXF1aXJlZC4gVGhlIHdpZGdldCBvY2N1cGllcyB0aGUgd2lkdGggb2YgdGhlIGRpYWxv ZywKKyAgICAgKiBhbmQgaXMgcG9zaXRpb25lZCBpbW1lZGlhdGVseSBiZWxvdyB0aGUgcmVndWxh ciBleHByZXNzaW9uIHN1cHBvcnQKKyAgICAgKiB3aWRnZXRzIGZvciB0aGUgcGF0dGVybiBzdHJp bmcuCisgICAgICovCisgICAgUVdpZGdldCAqZmluZEV4dGVuc2lvbigpOworCisJLyoqCisJICog QmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zCisJICovCisJCisgICAgdm9pZCBzZXRU ZXh0KFFTdHJpbmcgc3RyaW5nKTsKKyAgICB2b2lkIHNldENhc2VTZW5zaXRpdmUoIGJvb2wgYiAp OworICAgIGJvb2wgY2FzZV9zZW5zaXRpdmUoKSBjb25zdDsKKyAgICB2b2lkIHNldERpcmVjdGlv biggYm9vbCBiICk7CisgICAgYm9vbCBnZXRfZGlyZWN0aW9uKCkgY29uc3Q7CisKKworc2lnbmFs czoKKworICAgIC8qKgorICAgICAqIFRoZSBPSyBidXR0b24gd2FzIHByZXNzZWQsIHRoZSBwYXR0 ZXJuIHdhcyBub3QgZW1wdHksIGFuZCBpZiBpdCBpcworICAgICAqIHN1cHBvc2VkIHRvIGJlIGEg cmVndWxhciBleHByZXNzaW9uLCBpdCBpcyBrbm93biB0byBiZSB2YWxpZC4KKyAgICAgKi8KKyAg ICB2b2lkIG9rQ2xpY2tlZCgpOworCitwcm90ZWN0ZWQgc2xvdHM6CisKKyAgICB2b2lkIHNsb3RP aygpOworICAgIHZvaWQgc2xvdFNlbGVjdGVkVGV4dFRvZ2dsZWQoYm9vbCk7CisgICAgdm9pZCBz aG93UGF0dGVybnMoKTsKKyAgICB2b2lkIHNob3dQbGFjZWhvbGRlcnMoKTsKKyAgICB2b2lkIHRl eHRTZWFyY2hDaGFuZ2VkKCBjb25zdCBRU3RyaW5nICYpOworcHJpdmF0ZToKKworICAgIFFHcm91 cEJveCAqbV9maW5kR3JwOworICAgIFFMYWJlbCAqbV9maW5kTGFiZWw7CisgICAgS0hpc3RvcnlD b21ibyAqbV9maW5kOworICAgIFFDaGVja0JveCAqbV9yZWdFeHA7CisgICAgUVB1c2hCdXR0b24g Km1fcmVnRXhwSXRlbTsKKyAgICBRR3JpZExheW91dCAqbV9maW5kTGF5b3V0OworICAgIFFXaWRn ZXQgKm1fZmluZEV4dGVuc2lvbjsKKworICAgIFFHcm91cEJveCAqbV9vcHRpb25HcnA7CisgICAg UUNoZWNrQm94ICptX3dob2xlV29yZHNPbmx5OworICAgIFFDaGVja0JveCAqbV9mcm9tQ3Vyc29y OworICAgIFFDaGVja0JveCAqbV9zZWxlY3RlZFRleHQ7CisgICAgUUNoZWNrQm94ICptX2Nhc2VT ZW5zaXRpdmU7CisgICAgUUNoZWNrQm94ICptX2ZpbmRCYWNrd2FyZHM7CisKKyAgICBRUG9wdXBN ZW51ICptX3BhdHRlcm5zOworCisgICAgLy8gT3VyIGRpcnR5IGxpdHRsZSBzZWNyZXQgaXMgdGhh dCB3ZSBhbHNvIGltcGxlbWVudCB0aGUgInJlcGxhY2UiIGRpYWxvZy4gQnV0IHdlCisgICAgLy8g a2VlcCB0aGF0IGZhY3QgaGlkZGVuIGZyb20gYWxsIGJ1dCBvdXIgZnJpZW5kcy4KKworICAgIGZy aWVuZCBjbGFzcyBLRWRSZXBsYWNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgZmlu ZCBkaWFsb2cgd2l0aCBhIHBhcmVudCBvYmplY3QgYW5kIGEgbmFtZS4gVGhpcyB2ZXJzaW9uIG9m IHRoZQorICAgICAqIGNvbnN0cnVjdG9yIGlzIGZvciB1c2UgYnkgZnJpZW5kcyBvbmx5IQorICAg ICAqCisgICAgICogQHBhcmFtIGZvclJlcGxhY2UgSXMgdGhpcyBhIHJlcGxhY2UgZGlhbG9nPwor ICAgICAqLworICAgIEtFZEZpbmQoIFFXaWRnZXQgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwg Ym9vbCBmb3JSZXBsYWNlICk7CisgICAgdm9pZCBpbml0KCBib29sIGZvclJlcGxhY2UsIGNvbnN0 IFFTdHJpbmdMaXN0ICZmaW5kU3RyaW5ncywgYm9vbCBoYXNTZWxlY3Rpb24gKTsKKworICAgIFFH cm91cEJveCAqbV9yZXBsYWNlR3JwOworICAgIFFMYWJlbCAqbV9yZXBsYWNlTGFiZWw7CisgICAg S0hpc3RvcnlDb21ibyAqbV9yZXBsYWNlOworICAgIFFDaGVja0JveCogbV9iYWNrUmVmOworICAg IFFQdXNoQnV0dG9uKiBtX2JhY2tSZWZJdGVtOworICAgIFFHcmlkTGF5b3V0ICptX3JlcGxhY2VM YXlvdXQ7CisgICAgUVdpZGdldCAqbV9yZXBsYWNlRXh0ZW5zaW9uOworCisgICAgUUNoZWNrQm94 KiBtX3Byb21wdE9uUmVwbGFjZTsKKworICAgIFFQb3B1cE1lbnUgKm1fcGxhY2Vob2xkZXJzOwor CisgICAgLy8gQmluYXJ5IGNvbXBhdGlibGUgZXh0ZW5zaWJpbGl0eS4KKyAgICBjbGFzcyBLRWRG aW5kUHJpdmF0ZTsKKyAgICBLRWRGaW5kUHJpdmF0ZSAqZDsKK307CisKKy8qKgorICogQHNob3J0 IEEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgImZpbmQiIGZ1bmN0aW9uLgorICoKKyAq IEBhdXRob3IgUy5SLkhhcXVlIDxzcmhhcXVlQGllZS5vcmc+CisgKgorICogQHNlY3QgRGV0YWls CisgKgorICogVGhpcyBjbGFzcyBpbmNsdWRlcyBwcm9tcHQgaGFuZGxpbmcgZXRjLiBBbHNvIHBy b3ZpZGVzIHNvbWUKKyAqIHN0YXRpYyBmdW5jdGlvbnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3Jl YXRlIGN1c3RvbSBiZWhhdmlvdXIKKyAqIGluc3RlYWQgb2YgdXNpbmcgdGhlIGNsYXNzIGRpcmVj dGx5LgorICoKKyAqIEBzZWN0IEV4YW1wbGUKKyAqCisgKiBUbyB1c2UgdGhlIGNsYXNzIHRvIGlt cGxlbWVudCBhIGNvbXBsZXRlIGZpbmQgZmVhdHVyZToKKyAqCisgKiA8cHJlPgorICoKKyAqICAv LyBUaGlzIGNyZWF0ZXMgYSBmaW5kLW5leHQtcHJvbXB0IGRpYWxvZyBpZiBuZWVkZWQuCisgKiAg ZGlhbG9nID0gbmV3IEtFZEZpbmROZXh0KGZpbmQsIG9wdGlvbnMpOworICoKKyAqICAvLyBDb25u ZWN0IHNpZ25hbHMgdG8gY29kZSB3aGljaCBoYW5kbGVzIGhpZ2hsaWdodGluZworICogIC8vIG9m IGZvdW5kIHRleHQuCisgKiAgY29ubmVjdChkaWFsb2csIFNJR05BTCggaGlnaGxpZ2h0KCBjb25z dCBRU3RyaW5nICYsIGludCwgaW50LCBjb25zdCBRUmVjdCAmICkgKSwKKyAqICAgICAgICAgIHRo aXMsIFNMT1QoIGhpZ2hsaWdodCggY29uc3QgUVN0cmluZyAmLCBpbnQsIGludCwgY29uc3QgUVJl Y3QgJiApICkgKTsKKyAqCisgKiAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgdGV4dCBmcmFnbWVudHMg b2Ygb3VyIGRvY3VtZW50IG9yIHNlbGVjdGlvbgorICogIGZvciAodGV4dCBjaG9zZW4gYnkgb3B0 aW9uIFNlbGVjdGVkVGV4dCBhbmQgaW4gYSBkaXJlY3Rpb24gc2V0IGJ5IEZpbmRCYWNrd2FyZHMp CisgKiAgICAgICAvLyBkb24ndCBmb3JnZXQgdG8gaG9ub3VyIEZyb21DdXJzb3IgdG9vCisgKiAg eworICogICAgICAvLyBMZXQgS0VkRmluZE5leHQgaW5zcGVjdCB0aGUgdGV4dCBmcmFnbWVudCwg YW5kIGRpc3BsYXkgYSBkaWFsb2cgaWYgYSBtYXRjaCBpcyBmb3VuZAorICogICAgICBpZiAoICFk aWFsb2ctPmZpbmQoIHRleHRfZnJhZ21lbnQsIHJlZ2lvbl90b19leHBvc2UgKSApCisgKiAgICAg ICAgICBicmVhazsgLy8gaWYgY2FuY2VsbGVkIGJ5IHVzZXIKKyAqICB9CisgKiAgZGVsZXRlIGRp YWxvZzsKKyAqCisgKiA8L3ByZT4KKyAqLworCitjbGFzcyBLRWRGaW5kTmV4dCA6CisgICAgcHVi bGljIEtEaWFsb2dCYXNlCit7CisgICAgUV9PQkpFQ1QKKworcHVibGljOgorCisgICAgLy8gV2ls bCBjcmVhdGUgYSBwcm9tcHQgZGlhbG9nIGFuZCB1c2UgaXQgYXMgbmVlZGVkLgorICAgIEtFZEZp bmROZXh0KGNvbnN0IFFTdHJpbmcgJnBhdHRlcm4sIGxvbmcgb3B0aW9ucywgUVdpZGdldCAqcGFy ZW50ID0gMCk7CisgICAgfktFZEZpbmROZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiBXYWxrIHRo ZSB0ZXh0IGZyYWdtZW50IChlLmcuIGt3cml0ZSBsaW5lLCBrc3ByZWFkIGNlbGwpIGxvb2tpbmcg Zm9yIG1hdGNoZXMuCisgICAgICogRm9yIGVhY2ggbWF0Y2gsIGVtaXRzIHRoZSBleHBvc2UoKSBz aWduYWwgYW5kIGRpc3BsYXlzIHRoZSBmaW5kLWFnYWluIGRpYWxvZworICAgICAqIHByb2NlZWRp bmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBmcmFnbWVudCB0byBtb2Rp ZnkuCisgICAgICogQHBhcmFtIGV4cG9zZSBUaGUgcmVnaW9uIHRvIGV4cG9zZQorICAgICAqIEBy ZXR1cm4gZmFsc2UgaWYgdGhlIHVzZXIgZWxlY3RlZCB0byBkaXNjb250aW51ZSB0aGUgZmluZC4K KyAgICAgKi8KKyAgICBib29sIGZpbmQoY29uc3QgUVN0cmluZyAmdGV4dCwgY29uc3QgUVJlY3Qg JmV4cG9zZSk7CisKKyAgICAvKioKKyAgICAgKiBTZWFyY2ggdGhlIGdpdmVuIHN0cmluZywgYW5k IHJldHVybnMgd2hldGhlciBhIG1hdGNoIHdhcyBmb3VuZC4gSWYgb25lIGlzLAorICAgICAqIHRo ZSBsZW5ndGggb2YgdGhlIHN0cmluZyBtYXRjaGVkIGlzIGFsc28gcmV0dXJuZWQuCisgICAgICoK KyAgICAgKiBBIHBlcmZvcm1hbmNlIG9wdGltaXNlZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBp cyBwcm92aWRlZCBmb3IgdXNlCisgICAgICogd2l0aCByZWd1bGFyIGV4cHJlc3Npb25zLgorICAg ICAqCisgICAgICogQHBhcmFtIHRleHQgVGhlIHN0cmluZyB0byBzZWFyY2guCisgICAgICogQHBh cmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gbG9vayBmb3IuCisgICAgICogQHBhcmFtIGluZGV4 IFRoZSBzdGFydGluZyBpbmRleCBpbnRvIHRoZSBzdHJpbmcuCisgICAgICogQHBhcmFtIG9wdGlv bnMuIFRoZSBvcHRpb25zIHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCBhdCB3aGlj aCBhIG1hdGNoIHdhcyBmb3VuZCwgb3IgLTEgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLgorICAgICAq LworICAgIHN0YXRpYyBpbnQgZmluZCggY29uc3QgUVN0cmluZyAmdGV4dCwgY29uc3QgUVN0cmlu ZyAmcGF0dGVybiwgaW50IGluZGV4LCBsb25nIG9wdGlvbnMsIGludCAqbWF0Y2hlZGxlbmd0aCAp OworICAgIHN0YXRpYyBpbnQgZmluZCggY29uc3QgUVN0cmluZyAmdGV4dCwgY29uc3QgUVJlZ0V4 cCAmcGF0dGVybiwgaW50IGluZGV4LCBsb25nIG9wdGlvbnMsIGludCAqbWF0Y2hlZGxlbmd0aCAp OworCisgICAgLyoqCisgICAgICogQWJvcnQgdGhlIGN1cnJlbnQgZmluZCBwcm9jZXNzLiBDYWxs IHRoaXMgd2hlbiB0aGUgcGFyZW50IHdpZGdldAorICAgICAqIGlzIGdldHRpbmcgZGVzdHJveWVk LgorICAgICAqLworICAgIHZvaWQgYWJvcnQoKTsKKworCQorCQorc2lnbmFsczoKKworICAgIC8v IENvbm5lY3QgdG8gdGhpcyBzaWduYWwgdG8gaW1wbGVtZW50IGhpZ2hsaWdodGluZyBvZiBmb3Vu ZCB0ZXh0IGR1cmluZyB0aGUgZmluZAorICAgIC8vIG9wZXJhdGlvbi4KKyAgICB2b2lkIGhpZ2hs aWdodChjb25zdCBRU3RyaW5nICZ0ZXh0LCBpbnQgbWF0Y2hpbmdJbmRleCwgaW50IG1hdGNoZWRM ZW5ndGgsIGNvbnN0IFFSZWN0ICZleHBvc2UsIGxvbmcgb3B0aW9ucyk7CisKK3ByaXZhdGU6CisK KyAgICBRU3RyaW5nIG1fcGF0dGVybjsKKyAgICBRUmVnRXhwICptX3JlZ0V4cDsKKyAgICBsb25n IG1fb3B0aW9uczsKKyAgICBRV2lkZ2V0ICptX3BhcmVudDsKKyAgICB1bnNpZ25lZCBtX21hdGNo ZXM7CisgICAgUVN0cmluZyBtX3RleHQ7CisgICAgaW50IG1faW5kZXg7CisgICAgUVJlY3QgbV9l eHBvc2U7CisgICAgaW50IG1fbWF0Y2hlZExlbmd0aDsKKyAgICBib29sIG1fY2FuY2VsbGVkOwor CisgICAgc3RhdGljIGJvb2wgaXNJbldvcmQoIFFDaGFyIGNoICk7CisgICAgc3RhdGljIGJvb2wg aXNXaG9sZVdvcmRzKCBjb25zdCBRU3RyaW5nICZ0ZXh0LCBpbnQgc3RhcnRzLCBpbnQgbWF0Y2hl ZExlbmd0aCApOworCisgICAgLy8gQmluYXJ5IGNvbXBhdGlibGUgZXh0ZW5zaWJpbGl0eS4KKyAg ICBjbGFzcyBLRWRGaW5kTmV4dFByaXZhdGU7CisgICAgS0VkRmluZE5leHRQcml2YXRlICpkOwor Citwcml2YXRlIHNsb3RzOgorCisgICAgdmlydHVhbCB2b2lkIHNsb3RVc2VyMSgpOyAgIC8vIFll cworICAgIHZpcnR1YWwgdm9pZCBzbG90Q2xvc2UoKTsKK307CisKKyNlbmRpZgpJbmRleDoga2Vk aXRjbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9ob21lL2tkZS9rZGVsaWJzL2tkZXVpL2tlZGl0 Y2wuaCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS41MQpkaWZmIC11IC0zIC1wIC1yMS41MSBrZWRp dGNsLmgKLS0tIGtlZGl0Y2wuaAkyMDAxLzEwLzEyIDE3OjA2OjI4CTEuNTEKKysrIGtlZGl0Y2wu aAkyMDAxLzExLzE3IDIzOjQyOjEwCkBAIC0yMyw3ICsyMywxMCBAQAogCiAjaW5jbHVkZSA8cW11 bHRpbGluZWVkaXQuaD4KICNpbmNsdWRlIDxxc3RyaW5nLmg+CisjaW5jbHVkZSA8cXN0cmluZ2xp c3QuaD4KICNpbmNsdWRlIDxrZGlhbG9nYmFzZS5oPgorI2luY2x1ZGUgPGtlZGZpbmQuaD4KKyNp bmNsdWRlIDxrZWRyZXBsYWNlLmg+CiAKIGNsYXNzIFFEcm9wRXZlbnQ7CiBjbGFzcyBRUHVzaEJ1 dHRvbjsKQEAgLTM0LDYgKzM3LDggQEAgY2xhc3MgUVRleHRTdHJlYW07CiBjbGFzcyBLSGlzdG9y eUNvbWJvOwogY2xhc3MgS0ludE51bUlucHV0OwogY2xhc3MgUVZCdXR0b25Hcm91cDsKK2NsYXNz IEtFZEZpbmQ7CitjbGFzcyBLRWRSZXBsYWNlOwogCiBjbGFzcyBLRWRHb3RvTGluZSA6IHB1Ymxp YyBLRGlhbG9nQmFzZQogewpAQCAtNTMsMTA5ICs1OCw2IEBAIHByaXZhdGU6CiAgICAgS0VkR290 b0xpbmVQcml2YXRlICpkOwogfTsKIAotLy8vCi1jbGFzcyBLRWRGaW5kIDogcHVibGljIEtEaWFs b2dCYXNlCi17Ci0gICAgUV9PQkpFQ1QKLSAgICBRX1BST1BFUlRZKCBRU3RyaW5nIHRleHQgUkVB RCBnZXRUZXh0IFdSSVRFIHNldFRleHQgKQotICAgIFFfUFJPUEVSVFkoIGJvb2wgY2FzZVNlbnNp dGl2aXR5IFJFQUQgY2FzZV9zZW5zaXRpdmUgV1JJVEUgc2V0Q2FzZVNlbnNpdGl2ZSApCi0gICAg UV9QUk9QRVJUWSggYm9vbCBkaXJlY3Rpb24gUkVBRCBnZXRfZGlyZWN0aW9uIFdSSVRFIHNldERp cmVjdGlvbiApCi1wdWJsaWM6Ci0KLSAgICBLRWRGaW5kKCBRV2lkZ2V0ICpwYXJlbnQgPSAwLCBj b25zdCBjaGFyICpuYW1lPTAsIGJvb2wgbW9kYWw9dHJ1ZSk7Ci0gICAgfktFZEZpbmQoKTsKLQot ICAgIFFTdHJpbmcgZ2V0VGV4dCgpIGNvbnN0OwotICAgIHZvaWQgc2V0VGV4dChRU3RyaW5nIHN0 cmluZyk7Ci0gICAgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKCBib29sIGIgKTsKLSAgICBib29sIGNh c2Vfc2Vuc2l0aXZlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXREaXJlY3Rpb24oIGJvb2wgYiApOwot ICAgIGJvb2wgZ2V0X2RpcmVjdGlvbigpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogQHJldHVy bnMgdGhlIGNvbWJvYm94IGNvbnRhaW5pbmcgdGhlIGhpc3Rvcnkgb2Ygc2VhcmNoZXMuIENhbiBi ZSB1c2VkCi0gICAgICogdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgaGlzdG9yeS4KLSAgICAgKi8K LSAgICBLSGlzdG9yeUNvbWJvICpzZWFyY2hDb21ibygpIGNvbnN0OwotCi1wcm90ZWN0ZWQgc2xv dHM6Ci0gICAgdm9pZCBzbG90Q2FuY2VsKCB2b2lkICk7Ci0gICAgdm9pZCBzbG90VXNlcjEoIHZv aWQgKTsKLSAgICB2b2lkIHRleHRTZWFyY2hDaGFuZ2VkICggY29uc3QgUVN0cmluZyAmICk7Ci0K LXByb3RlY3RlZDoKLSAgUVZCdXR0b25Hcm91cCogZ3JvdXA7Ci0KLXByaXZhdGU6Ci0gICAgUUNo ZWNrQm94ICpzZW5zaXRpdmU7Ci0gICAgUUNoZWNrQm94ICpkaXJlY3Rpb247Ci0gICAgUUxpbmVF ZGl0ICp2YWx1ZTsgLy8gRklYTUU6IHJlbW92ZSwgdW51c2VkCi0KLSAgICBjbGFzcyBLRWRGaW5k UHJpdmF0ZTsKLSAgICBLRWRGaW5kUHJpdmF0ZSAqZDsKLSAgICB2aXJ0dWFsIHZvaWQgZG9uZShp bnQgaSApIHsgS0RpYWxvZ0Jhc2U6OmRvbmUoaSk7IH0KLQotc2lnbmFsczoKLQotICAgIHZvaWQg c2VhcmNoKCk7Ci0gICAgdm9pZCBkb25lKCk7Ci19OwotCi0vLy8KLWNsYXNzIEtFZFJlcGxhY2Ug OiBwdWJsaWMgS0RpYWxvZ0Jhc2UKLXsKLSAgICBRX09CSkVDVAotCi1wdWJsaWM6Ci0KLSAgICBL RWRSZXBsYWNlICggUVdpZGdldCAqcGFyZW50ID0gMCwgY29uc3QgY2hhciAqbmFtZT0wLCBib29s IG1vZGFsPXRydWUgKTsKLSAgICB+S0VkUmVwbGFjZSgpOwotCi0gICAgUVN0cmluZyAJZ2V0VGV4 dCgpOwotICAgIFFTdHJpbmcgCWdldFJlcGxhY2VUZXh0KCk7Ci0gICAgdm9pZCAJc2V0VGV4dChR U3RyaW5nKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm5zIHRoZSBjb21ib2JveCBjb250YWlu aW5nIHRoZSBoaXN0b3J5IG9mIHNlYXJjaGVzLiBDYW4gYmUgdXNlZAotICAgICAqIHRvIHNhdmUg YW5kIHJlc3RvcmUgdGhlIGhpc3RvcnkuCi0gICAgICovCi0gICAgS0hpc3RvcnlDb21ibyAqc2Vh cmNoQ29tYm8oKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm5zIHRoZSBjb21ib2Jv eCBjb250YWluaW5nIHRoZSBoaXN0b3J5IG9mIHJlcGxhY2VzLiBDYW4gYmUgdXNlZAotICAgICAq IHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGhpc3RvcnkuCi0gICAgICovCi0gICAgS0hpc3RvcnlD b21ibyAqcmVwbGFjZUNvbWJvKCkgY29uc3Q7Ci0KLSAgICBRTGluZUVkaXQgCSp2YWx1ZTsgLy8g RklYTUU6IHJlbW92ZSwgdW51c2VkCi0gICAgUUxpbmVFZGl0IAkqcmVwbGFjZV92YWx1ZTsgLy8g RklYTUU6IHJlbW92ZSwgdW51c2VkCi0gICAgYm9vbCAJY2FzZV9zZW5zaXRpdmUoKTsKLSAgICBi b29sIAlnZXRfZGlyZWN0aW9uKCk7Ci0KLXByb3RlY3RlZCBzbG90czoKLSAgICB2b2lkIHNsb3RD YW5jZWwoIHZvaWQgKTsKLSAgICB2b2lkIHNsb3RDbG9zZSggdm9pZCApOwotICAgIHZvaWQgc2xv dFVzZXIxKCB2b2lkICk7Ci0gICAgdm9pZCBzbG90VXNlcjIoIHZvaWQgKTsKLSAgICB2b2lkIHNs b3RVc2VyMyggdm9pZCApOwotICAgIHZvaWQgdGV4dFNlYXJjaENoYW5nZWQgKCBjb25zdCBRU3Ry aW5nICYgKTsKLQotcHJpdmF0ZToKLSAgICBRQ2hlY2tCb3ggCSpzZW5zaXRpdmU7Ci0gICAgUUNo ZWNrQm94IAkqZGlyZWN0aW9uOwotCi0gICAgY2xhc3MgS0VkUmVwbGFjZVByaXZhdGU7Ci0gICAg S0VkUmVwbGFjZVByaXZhdGUgKmQ7Ci0JdmlydHVhbCB2b2lkIGRvbmUoaW50IGkgKSB7IEtEaWFs b2dCYXNlOjpkb25lKGkpOyB9Ci0KLXNpZ25hbHM6Ci0gICAgdm9pZCByZXBsYWNlKCk7Ci0gICAg dm9pZCBmaW5kKCk7Ci0gICAgdm9pZCByZXBsYWNlQWxsKCk7Ci0gICAgdm9pZCBkb25lKCk7Ci19 OwotCi0KIC8qKgogICogQSBzaW1wbGUgdGV4dCBlZGl0b3IgZm9yIHRoZSBLREUgcHJvamVjdC4K ICAqCkBAIC0xNzUsMTMgKzc3LDYgQEAgcHVibGljOgogICAgIH5LRWRpdCgpOwogCiAgICAgLyoq Ci0gICAgICogU2VhcmNoIGRpcmVjdGlvbnMuCi0gICAgICogQGludGVybmFsCi0gICAgICoqLwot ICAgIGVudW0geyBOT05FLAotCSAgIEZPUldBUkQsCi0JICAgQkFDS1dBUkQgfTsKLSAgICAvKioK ICAgICAgKiBJbnNlcnQgdGV4dCBmcm9tIHRoZSB0ZXh0IHN0cmVhbSBpbnRvIHRoZSBlZGl0IHdp ZGdldC4KICAgICAgKiovCiAgICAgdm9pZCBpbnNlcnRUZXh0KFFUZXh0U3RyZWFtICopOwpAQCAt MjA4LDE2ICsxMDMsNiBAQCBwdWJsaWM6CiAgICAgdm9pZCAJc2VhcmNoKCk7CiAKICAgICAvKioK LSAgICAgKiBSZXBlYXQgdGhlIGxhc3Qgc2VhcmNoIHNwZWNpZmllZCBvbiB0aGUgc2VhcmNoIGRp YWxvZy4KLSAgICAgKgotICAgICAqICBJZiB0aGUgdXNlciBoYXNuJ3Qgc2VhcmNoZWQgZm9yIGFu eXRoaW5nIHVudGlsIG5vdywgdGhpcyBtZXRob2QKLSAgICAgKiAgIHdpbGwgc2ltcGx5IHJldHVy biB3aXRob3V0IGRvaW5nIGFueXRoaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBAcCB0cnVl IGlmIGEgc2VhcmNoIHdhcyBkb25lLiBAcCBmYWxzZSBpZiBubyBzZWFyY2ggd2FzIGRvbmUuCi0g ICAgICoqLwotICAgIGJvb2wgCXJlcGVhdFNlYXJjaCgpOwotCi0gICAgLyoqCiAgICAgICogUHJl c2VudCBhIFNlYXJjaCBhbmQgUmVwbGFjZSBEaWFsb2cgdG8gdGhlIHVzZXIuCiAgICAgICoqLwog ICAgIHZvaWQgCXJlcGxhY2UoKTsKQEAgLTMyOSwzNyArMjE0LDYgQEAgcHJpdmF0ZSBzbG90czoK ICAgICAgICAqKi8KICAgICB2b2lkIG1pc3NwZWxsaW5nIChRU3RyaW5nIHdvcmQsIFFTdHJpbmdM aXN0ICosIHVuc2lnbmVkIHBvcyk7CiAKLSAgICAgIC8qKgotICAgICAgICogQGludGVybmFsCi0g ICAgICAgKiBDYWxsZWQgZnJvbSBzZWFyY2ggZGlhbG9nLgotICAgICAgICoqLwotICAgIHZvaWQg c2VhcmNoX3Nsb3QoKTsKLQotICAgICAgLyoqCi0gICAgICAgKiBAaW50ZXJuYWwKLSAgICAgICAq Ki8KLSAgICB2b2lkIHNlYXJjaGRvbmVfc2xvdCgpOwotCi0gICAgICAvKioKLSAgICAgICAqIEBp bnRlcm5hbAotICAgICAgICoqLwotICAgIHZvaWQgcmVwbGFjZV9zbG90KCk7Ci0KLSAgICAgIC8q KgotICAgICAgICogQGludGVybmFsCi0gICAgICAgKiovCi0gICAgdm9pZCByZXBsYWNlX2FsbF9z bG90KCk7Ci0KLSAgICAgIC8qKgotICAgICAgICogQGludGVybmFsCi0gICAgICAgKiovCi0gICAg dm9pZCByZXBsYWNlX3NlYXJjaF9zbG90KCk7Ci0KLSAgICAgIC8qKgotICAgICAgICogQGludGVy bmFsCi0gICAgICAgKiovCi0gICAgdm9pZCByZXBsYWNlZG9uZV9zbG90KCk7Ci0KICAgICB2b2lk IGNvbXB1dGVQb3NpdGlvbigpOwogCiAgICAgICAvKioKQEAgLTM2NywxNCArMjIxLDI4IEBAIHBy aXZhdGUgc2xvdHM6CiAgICAgICAgKiovCiAgICAgdm9pZCByZXBhaW50QWxsKCk7CiAKK3Byb3Rl Y3RlZCBzbG90czoKKwkJCS8qKgorCQkJICogQ2FsbGVkIGJ5IHNlYXJjaCB3aGVuIHRoZSBwYXR0 ZXJuIGlzIGZvdW5kCisJCQkgKi8KKwkJdmlydHVhbCB2b2lkIGhpZ2hsaWdodCggY29uc3QgUVN0 cmluZyAmLCBpbnQsIGludCwgY29uc3QgUVJlY3QgJiwgbG9uZyApOworCQkKKwkJCS8qKgorCQkJ ICogQ2FsbGVkIGJ5IHRoZSBGaW5kTmV4dCB3aW5kb3cgd2hlbiBvayBpcyBwcmVzc2VkCisJCQkg Ki8KKwkJdmlydHVhbCB2b2lkIEZpbmROZXh0T2sgKCk7CisJCQkKKwkJCS8qCisJCQkgKiBDYWxs ZWQgYnkgdGhlIEZpbmROZXh0IHdpbmRvdyB3aGVuIGNsb3NlIGlzIHByZXNzZWQKKwkJCSAqLwor CQl2aXJ0dWFsIHZvaWQgRmluZE5leHRDbG9zZSAoKTsKKworCQkJLyoKKwkJCSAqIENhbGxlZCBi eSByZXBsYWNlIGRpYWxvZyB3aGVuIG9rIGlzIHByZXNzZWQKKwkJCSAqLworCQl2aXJ0dWFsIHZv aWQgZG9yZXBsYWNlIChjb25zdCBRU3RyaW5nICYsIGludCwgaW50LGludCwgY29uc3QgUVJlY3Qg JiwgbG9uZyk7CiAKIHByb3RlY3RlZDoKLSAgICBpbnQgCWRvU2VhcmNoKFFTdHJpbmcgc19wYXR0 ZXJuLCBib29sIGNhc2Vfc2Vuc2l0aXZlLAotCQkJIGJvb2wgcmVnZXgsIGJvb2wgZm9yd2FyZCxp bnQgbGluZSwgaW50IGNvbCk7Ci0KLSAgICBpbnQgCWRvUmVwbGFjZShRU3RyaW5nIHNfcGF0dGVy biwgYm9vbCBjYXNlX3NlbnNpdGl2ZSwKLQkJCSAgYm9vbCByZWdleCwgYm9vbCBmb3J3YXJkLGlu dCBsaW5lLCBpbnQgY29sLGJvb2wgcmVwbGFjZSk7Ci0KICAgICAgIC8qKgogICAgICAgICogU2V0 cyBsaW5lIGFuZCBjb2wgdG8gdGhlIHBvc2l0aW9uIHBvcywgY29uc2lkZXJpbmcgd29yZCB3cmFw LgogICAgICAgICoqLwpAQCAtNDExLDEwICsyNzksMTIgQEAgcHJpdmF0ZToKIAogICAgIFFUaW1l ciogcmVwYWludFRpbWVyOwogCi0gICAgUVN0cmluZwlraWxsYnVmZmVyc3RyaW5nOworICAgIFFT dHJpbmcJCWtpbGxidWZmZXJzdHJpbmc7CiAgICAgUVdpZGdldCAgICAgKnBhcmVudDsKICAgICBL RWRGaW5kIAkqc3JjaGRpYWxvZzsKICAgICBLRWRSZXBsYWNlIAkqcmVwbGFjZV9kaWFsb2c7CisJ UVN0cmluZ0xpc3QJKmZpbmRsaXN0OworCVFTdHJpbmdMaXN0CSpyZXBsYWNlbGlzdDsKICAgICBL RWRHb3RvTGluZSAqZ290b2RpYWxvZzsKIAogICAgIFFTdHJpbmcgICAgIHBhdHRlcm47CkBAIC00 MjMsMTMgKzI5MywxMyBAQCBwcml2YXRlOgogICAgIGJvb2wJa2lsbGluZzsKICAgICBib29sIAlr aWxsdHJ1ZTsKICAgICBib29sIAlsYXN0d2FzYW5ld2xpbmU7Ci0gICAgYm9vbCAgICAgICAgc2F2 ZWRfcmVhZG9ubHlzdGF0ZTsKKyAgICBib29sCXNhdmVkX3JlYWRvbmx5c3RhdGU7CiAgICAgaW50 IAlsYXN0X3NlYXJjaDsKICAgICBpbnQgCWxhc3RfcmVwbGFjZTsKICAgICBpbnQgCXJlcGxhY2Vf YWxsX2xpbmU7CiAgICAgaW50IAlyZXBsYWNlX2FsbF9jb2w7CiAKLSAgICBpbnQgCWxpbmVfcG9z LCBjb2xfcG9zOworICAgIGludAkJCWxpbmVfcG9zLCBjb2xfcG9zOwogICAgIGJvb2wgICAgICAg IGZpbGxfY29sdW1uX2lzX3NldDsKICAgICBib29sICAgICAgICB3b3JkX3dyYXBfaXNfc2V0Owog ICAgIGludCAgICAgICAgIGZpbGxfY29sdW1uX3ZhbHVlOwpJbmRleDoga2VkaXRjbDEuY3BwCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KUkNTIGZpbGU6IC9ob21lL2tkZS9rZGVsaWJzL2tkZXVpL2tlZGl0Y2wxLmNwcCx2 CnJldHJpZXZpbmcgcmV2aXNpb24gMS41MgpkaWZmIC11IC0zIC1wIC1yMS41MiBrZWRpdGNsMS5j cHAKLS0tIGtlZGl0Y2wxLmNwcAkyMDAxLzEwLzEyIDIyOjE3OjE0CTEuNTIKKysrIGtlZGl0Y2wx LmNwcAkyMDAxLzExLzE3IDIzOjQyOjEzCkBAIC02MSw2ICs2MSw4IEBAIEtFZGl0OjpLRWRpdChR V2lkZ2V0ICpfcGFyZW50LCBjb25zdCBjaGEKIAogICAgIHNyY2hkaWFsb2cgPSBOVUxMOwogICAg IHJlcGxhY2VfZGlhbG9nPSBOVUxMOworCWZpbmRsaXN0PW5ldyBRU3RyaW5nTGlzdCgpOworCXJl cGxhY2VsaXN0PW5ldyBRU3RyaW5nTGlzdCgpOwogICAgIGdvdG9kaWFsb2cgPSBOVUxMOwogCiAg ICAgc2V0QWNjZXB0RHJvcHModHJ1ZSk7CkBAIC03MCw3ICs3Miw5IEBAIEtFZGl0OjpLRWRpdChR V2lkZ2V0ICpfcGFyZW50LCBjb25zdCBjaGEKIAogS0VkaXQ6On5LRWRpdCgpCiB7Ci0gIGRlbGV0 ZSBkOworCWRlbGV0ZSBmaW5kbGlzdDsKKwlkZWxldGUgcmVwbGFjZWxpc3Q7CisJZGVsZXRlIGQ7 CiB9CiAKIHZvaWQKSW5kZXg6IGtlZGl0Y2wyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvaG9t ZS9rZGUva2RlbGlicy9rZGV1aS9rZWRpdGNsMi5jcHAsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEu NDMKZGlmZiAtdSAtMyAtcCAtcjEuNDMga2VkaXRjbDIuY3BwCi0tLSBrZWRpdGNsMi5jcHAJMjAw MS8xMC8xMiAxNzowNjoyOAkxLjQzCisrKyBrZWRpdGNsMi5jcHAJMjAwMS8xMS8xNyAyMzo0Mjox NwpAQCAtNDcsMTk3ICs0NywxNDggQEAKIC8vIEZpbmQgTWV0aG9kcwogLy8KIAotdm9pZCBLRWRp dDo6c2VhcmNoKCl7Ci0KK3ZvaWQgS0VkaXQ6OnNlYXJjaCgpCit7CisJaW50IG9wdGlvbnM7CisJ CiAgIGlmKCByZXBsYWNlX2RpYWxvZyAhPSAwICYmIHJlcGxhY2VfZGlhbG9nLT5pc1Zpc2libGUo KSA9PSB0cnVlICkKICAgewogICAgIHJlcGxhY2VfZGlhbG9nLT5oaWRlKCk7CiAgIH0KLQotICBp Ziggc3JjaGRpYWxvZyA9PSAwICkKLSAgewotICAgIHNyY2hkaWFsb2cgPSBuZXcgS0VkRmluZCgg dGhpcywgInNlYXJjaGRpYWxvZyIsIGZhbHNlKTsKLSAgICBjb25uZWN0KHNyY2hkaWFsb2csU0lH TkFMKHNlYXJjaCgpKSx0aGlzLFNMT1Qoc2VhcmNoX3Nsb3QoKSkpOwotICAgIGNvbm5lY3Qoc3Jj aGRpYWxvZyxTSUdOQUwoZG9uZSgpKSx0aGlzLFNMT1Qoc2VhcmNoZG9uZV9zbG90KCkpKTsKLSAg fQotCi0gIC8vIElmIHdlIGFscmVhZHkgc2VhcmNoZWQgLyByZXBsYWNlZCBzb21ldGhpbmcgYmVm b3JlIG1ha2Ugc3VyZSBpdCBzaG93cwotICAvLyB1cCBpbiB0aGUgZmluZCBkaWFsb2cgbGluZS1l ZGl0LgotCi0gIFFTdHJpbmcgc3RyaW5nOwotICBzdHJpbmcgPSBzcmNoZGlhbG9nLT5nZXRUZXh0 KCk7Ci0gIHNyY2hkaWFsb2ctPnNldFRleHQoc3RyaW5nLmlzRW1wdHkoKSA/IHBhdHRlcm4gOiBz dHJpbmcpOwotCi0gIHRoaXMtPmRlc2VsZWN0KCk7Ci0gIGxhc3Rfc2VhcmNoID0gTk9ORTsKLQot ICBzcmNoZGlhbG9nLT5zaG93KCk7Ci0gIHNyY2hkaWFsb2ctPnJlc3VsdCgpOwotfQotCi0KLXZv aWQgS0VkaXQ6OnNlYXJjaF9zbG90KCl7Ci0KLSAgaW50IGxpbmUsIGNvbDsKLQotICBpZiAoIXNy Y2hkaWFsb2cpCi0gICAgcmV0dXJuOwotCi0gIFFTdHJpbmcgdG9fZmluZF9zdHJpbmcgPSBzcmNo ZGlhbG9nLT5nZXRUZXh0KCk7Ci0gIGdldEN1cnNvclBvc2l0aW9uKCZsaW5lLCZjb2wpOwotCi0g IC8vIHNyY2hkaWFsb2ctPmdldF9kaXJlY3Rpb24oKSBpcyB0cnVlIGlmIHNlYXJjaGluZyBiYWNr d2FyZAotCi0gIGlmIChsYXN0X3NlYXJjaCAhPSBOT05FICYmIHNyY2hkaWFsb2ctPmdldF9kaXJl Y3Rpb24oKSl7Ci0gICAgY29sID0gY29sICAtIHBhdHRlcm4ubGVuZ3RoKCkgLSAxIDsKLSAgfQot Ci1hZ2FpbjoKLSAgaW50ICByZXN1bHQgPSBkb1NlYXJjaCh0b19maW5kX3N0cmluZywgc3JjaGRp YWxvZy0+Y2FzZV9zZW5zaXRpdmUoKSwKLQkJCSBGQUxTRSwgKCFzcmNoZGlhbG9nLT5nZXRfZGly ZWN0aW9uKCkpLGxpbmUsY29sKTsKLQotICBpZihyZXN1bHQgPT0gMCl7Ci0gICAgaWYoIXNyY2hk aWFsb2ctPmdldF9kaXJlY3Rpb24oKSl7IC8vIGZvcndhcmQgc2VhcmNoCi0KLSAgICAgIGludCBx dWVyeSA9IEtNZXNzYWdlQm94OjpxdWVzdGlvblllc05vKAotCQkJc3JjaGRpYWxvZywKLSAgICAg ICAgICAgICAgICAgICAgICAgIGkxOG4oIkVuZCBvZiBkb2N1bWVudCByZWFjaGVkLlxuIlwKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRpbnVlIGZyb20gdGhlIGJlZ2lubmluZz8i KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4oIkZpbmQiKSk7Ci0gICAgICBpZiAocXVl cnkgPT0gS01lc3NhZ2VCb3g6Olllcyl7Ci0JbGluZSA9IDA7Ci0JY29sID0gMDsKLQlnb3RvIGFn YWluOwotICAgICAgfQotICAgIH0KLSAgICBlbHNleyAvL2JhY2t3YXJkIHNlYXJjaAotCi0gICAg ICBpbnQgcXVlcnkgPSBLTWVzc2FnZUJveDo6cXVlc3Rpb25ZZXNObygKLQkJCXNyY2hkaWFsb2cs Ci0gICAgICAgICAgICAgICAgICAgICAgICBpMThuKCJCZWdpbm5pbmcgb2YgZG9jdW1lbnQgcmVh Y2hlZC5cbiJcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250aW51ZSBmcm9tIHRo ZSBlbmQ/IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBpMThuKCJGaW5kIikpOwotICAgICAg aWYgKHF1ZXJ5ID09IEtNZXNzYWdlQm94OjpZZXMpewotCVFTdHJpbmcgc3RyaW5nID0gdGV4dExp bmUoIG51bUxpbmVzKCkgLSAxICk7Ci0JbGluZSA9IG51bUxpbmVzKCkgLSAxOwotCWNvbCAgPSBz dHJpbmcubGVuZ3RoKCk7Ci0JbGFzdF9zZWFyY2ggPSBCQUNLV0FSRDsKLQlnb3RvIGFnYWluOwot ICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlewotICAgIGVtaXQgQ3Vyc29yUG9zaXRpb25DaGFu Z2VkKCk7Ci0gIH0KLX0KLQotCi0KLXZvaWQgS0VkaXQ6OnNlYXJjaGRvbmVfc2xvdCgpewotCi0g IGlmICghc3JjaGRpYWxvZykKLSAgICByZXR1cm47Ci0KLSAgc3JjaGRpYWxvZy0+aGlkZSgpOwot ICB0aGlzLT5zZXRGb2N1cygpOwotICBsYXN0X3NlYXJjaCA9IE5PTkU7Ci0KLX0KLQotaW50IEtF ZGl0Ojpkb1NlYXJjaChRU3RyaW5nIHNfcGF0dGVybiwgYm9vbCBjYXNlX3NlbnNpdGl2ZSwKLQkJ ICAgIGJvb2wgd2lsZGNhcmQsIGJvb2wgZm9yd2FyZCwgaW50IGxpbmUsIGludCBjb2wpewotCi0g ICh2b2lkKSB3aWxkY2FyZDsgLy8gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGV4dGVuc2lvbiB0byBy ZWdleAotCi0KLSAgaW50IGksIGxlbmd0aDsKLSAgaW50IHBvcyA9IC0xOwotCi0gIGlmKGZvcndh cmQpewotCi0gICAgUVN0cmluZyBzdHJpbmc7Ci0KLSAgICBmb3IoaSA9IGxpbmU7IGkgPCBudW1M aW5lcygpOyBpKyspIHsKLQotICAgICAgc3RyaW5nID0gdGV4dExpbmUoaSk7Ci0KLSAgICAgIHBv cyA9IHN0cmluZy5maW5kKHNfcGF0dGVybiwgaSA9PSBsaW5lID8gY29sIDogMCwgY2FzZV9zZW5z aXRpdmUpOwotCi0gICAgICBpZiggcG9zICE9IC0xKXsKLQotCWxlbmd0aCA9IHNfcGF0dGVybi5s ZW5ndGgoKTsKIAotCXNldEN1cnNvclBvc2l0aW9uKGkscG9zLEZBTFNFKTsKLQotCWZvcihpbnQg bCA9IDAgOyBsIDwgbGVuZ3RoOyBsKyspewotCSAgY3Vyc29yUmlnaHQoVFJVRSk7Ci0JfQotCi0J c2V0Q3Vyc29yUG9zaXRpb24oIGkgLCBwb3MgKyBsZW5ndGgsIFRSVUUgKTsKLQlwYXR0ZXJuID0g c19wYXR0ZXJuOwotCWxhc3Rfc2VhcmNoID0gRk9SV0FSRDsKLQotCXJldHVybiAxOwotICAgICAg fQotICAgIH0KLSAgfQotICBlbHNleyAvLyBzZWFyY2hpbmcgYmFja3dhcmRzCi0KLSAgICBRU3Ry aW5nIHN0cmluZzsKLQotICAgIGZvcihpID0gbGluZTsgaSA+PSAwOyBpLS0pIHsKLQotICAgICAg c3RyaW5nID0gdGV4dExpbmUoaSk7Ci0gICAgICBpbnQgbGluZV9sZW5ndGggPSBzdHJpbmcubGVu Z3RoKCk7Ci0KLSAgICAgIHBvcyA9IHN0cmluZy5maW5kUmV2KHNfcGF0dGVybiwgbGluZSA9PSBp ID8gY29sIDogbGluZV9sZW5ndGggLCBjYXNlX3NlbnNpdGl2ZSk7Ci0KLSAgICAgIGlmIChwb3Mg IT0gLTEpewotCi0JbGVuZ3RoID0gc19wYXR0ZXJuLmxlbmd0aCgpOwotCi0JaWYoICEgKGxpbmUg PT0gaSAmJiBwb3MgPiBjb2wgKSApewotCi0JICBzZXRDdXJzb3JQb3NpdGlvbihpICxwb3MgLEZB TFNFICk7Ci0KLQkgIGZvcihpbnQgbCA9IDAgOyBsIDwgbGVuZ3RoOyBsKyspewotCSAgICBjdXJz b3JSaWdodChUUlVFKTsKLQkgIH0KLQotCSAgc2V0Q3Vyc29yUG9zaXRpb24oaSAscG9zICsgbGVu Z3RoICxUUlVFICk7Ci0JICBwYXR0ZXJuID0gc19wYXR0ZXJuOwotCSAgbGFzdF9zZWFyY2ggPSBC QUNLV0FSRDsKLQkgIHJldHVybiAxOwotCisJc3JjaGRpYWxvZyA9IG5ldyBLRWRGaW5kICh0aGlz LCAic2VhcmNoZGlhbG9nIiwwLCpmaW5kbGlzdCx0aGlzLT5oYXNTZWxlY3RlZFRleHQoKSk7CisJ c3JjaGRpYWxvZy0+c2V0VGV4dChmaW5kbGlzdC0+bGFzdCgpKTsKKwlpZiAoIHNyY2hkaWFsb2ct PmV4ZWMoKSAhPSBRRGlhbG9nOjpBY2NlcHRlZCApIHJldHVybjsKKwkKKwlpZiAoZmluZGxpc3Qt PmNvbnRhaW5zKHNyY2hkaWFsb2ctPmdldFRleHQoKSk9PTApIGZpbmRsaXN0LT5hcHBlbmQoc3Jj aGRpYWxvZy0+Z2V0VGV4dCgpKTsKKwlLRWRGaW5kTmV4dCBmbiAoc3JjaGRpYWxvZy0+Z2V0VGV4 dCgpLHNyY2hkaWFsb2ctPm9wdGlvbnMoKSx0aGlzKTsKKworCWNvbm5lY3QgKCZmbiwgU0lHTkFM KCBoaWdobGlnaHQoIGNvbnN0IFFTdHJpbmcgJiwgaW50LCBpbnQsIGNvbnN0IFFSZWN0ICYsIGxv bmcgKSApLCB0aGlzLCBTTE9UKCBoaWdobGlnaHQoIGNvbnN0IFFTdHJpbmcgJiwgaW50LCBpbnQs IGNvbnN0IFFSZWN0ICYsIGxvbmcgKSApICk7CisKKwlvcHRpb25zID0gc3JjaGRpYWxvZy0+b3B0 aW9ucygpOworCQkKKwlRU3RyaW5nIF90ZXh0OworCVFSZWN0IHIoMCwwLDAsMCk7CisJaW50IHBh cmFmLHBhcmF0LGlkeGYsaWR4dDsKKwlpZiAob3B0aW9ucyAmIEtFZEZpbmQ6OlNlbGVjdGVkVGV4 dCkgeworCQlnZXRTZWxlY3Rpb24oJnBhcmFmLCZpZHhmLCZwYXJhdCwmaWR4dCk7CisJCS8qIGEg c21hbGwgaGFjayB0byBzaG93IHdoZXJlIGlzIHRoZSBzZWxlY3RlZCB0ZXh0LCB0aGlzIGlzIHRy YW5zbWl0dGVkIHdpdGggbm8gY2hhbmdlIHRvIHRoZSBoaWdobGlnaHQgZnVuY3Rpb24gKi8KKwkJ ci5zZXRUb3AocGFyYWYpOworCQlyLnNldExlZnQoaWR4Zik7CisJCXIuc2V0UmlnaHQoaWR4dCk7 CisJCXIuc2V0Qm90dG9tKHBhcmF0KTsKKwkJX3RleHQ9dGhpcy0+c2VsZWN0ZWRUZXh0KCk7CisJ fSBlbHNlIHsKKwkJLyogRnJvbUN1cnNvciBub3cgKi8KKwkJaWYgKG9wdGlvbnMgJiBLRWRGaW5k OjpGcm9tQ3Vyc29yKSB7CisJCQlpbnQgY3VycmVudHBhcmE9MDsKKwkJCWdldEN1cnNvclBvc2l0 aW9uICgmY3VycmVudHBhcmEsJmlkeGYpOworCQkJLyogZ2V0IGdsb2JhbCBpbmRleCAqLworCQkJ aW50IGk9MDsKKwkJCXdoaWxlIChpPCBjdXJyZW50cGFyYSkgeworCQkJCQlpZHhmKz1wYXJhZ3Jh cGhMZW5ndGgoaSsrKSsxOworCQkJfQorCQkJX3RleHQ9dGhpcy0+dGV4dCgpOworCQkJaWYgKG9w dGlvbnMgJiBLRWRGaW5kOjpGaW5kQmFja3dhcmRzKSB7CisJCQkJX3RleHQudHJ1bmNhdGUoaWR4 Zik7CisJCQkJLy9yLnNldFJpZ2h0KGlkeGYpOworCQkJfSBlbHNlIHsKKwkJCQlfdGV4dC5yZW1v dmUoMCxpZHhmKTsKKwkJCQlyLnNldFJpZ2h0KGlkeGYpOworCQkJfQorCQkJCisJCX0gZWxzZSB7 CisJCQlfdGV4dD0gdGhpcy0+dGV4dCgpOworCQl9CisJfQorCWZuLmZpbmQoX3RleHQscik7CisJ CisgIGRlbGV0ZSBzcmNoZGlhbG9nOworCXNyY2hkaWFsb2c9MDsKKworfQorCit2b2lkIEtFZGl0 OjpoaWdobGlnaHQgKCBjb25zdCBRU3RyaW5nICYsIGludCBtYXRjaGluZ0luZGV4LCBpbnQgbWF0 Y2hpbmdMZW5ndGgsIGNvbnN0IFFSZWN0ICZyICwgbG9uZyBvcHRpb25zICkgCit7CisJaW50IHBh cmFmcm9tPTAscGFyYXRvPTAsaW5kZXhmcm9tPTAsaW5kZXh0bz0wOworCisJLyogY2hlY2sgb3Vy IGxpdHRsZSBoYWNrIGZpcnN0ICovCisJaWYgKG9wdGlvbnMgJiBLRWRGaW5kOjpGcm9tQ3Vyc29y ICYmICEob3B0aW9ucyAmIEtFZEZpbmQ6OkZpbmRCYWNrd2FyZHMpKSB7CisJCW1hdGNoaW5nSW5k ZXgrPXIucmlnaHQoKTsKKwl9CisJCisJLyogZmluZCB0aGUgcmlnaHQgcGFyYWdyYXBoIGFuZCBp bmRleCB1c2luZyBhYnNvbHV0ZSBtYXRjaGluZ0luZGV4ICovCisJaW50IGN1cnJlbnRwYXJhPTAs IGN1cnJlbnRpZHg9MDsKKwkKKwl3aGlsZSAoY3VycmVudHBhcmE8ci50b3AoKSApIHsKKwkJCQkJ bWF0Y2hpbmdJbmRleCs9cGFyYWdyYXBoTGVuZ3RoKGN1cnJlbnRwYXJhKSsxOworCQkJCQljdXJy ZW50cGFyYSsrOworCQkJCQkvL2tkRGVidWcoMjk0KSA8PCAiY3VycmVudHBhcmEgOiAiIDw8IGN1 cnJlbnRwYXJhIDw8ICIgY3VycmVudGlkeCA6IiA8PCBjdXJyZW50aWR4IDw8IGVuZGw7CisJfQor CW1hdGNoaW5nSW5kZXgrPXIubGVmdCgpOworLy8Ja2REZWJ1ZygyOTQpIDw8ICJtYXRjaGluZ0lu ZGV4IGZyb20gOiAiIDw8IG1hdGNoaW5nSW5kZXggPDwgZW5kbDsKKwljdXJyZW50cGFyYT0wOwor CXdoaWxlIChjdXJyZW50cGFyYSA8IHBhcmFncmFwaHMoKSAmJiBwYXJhZ3JhcGhMZW5ndGgoY3Vy cmVudHBhcmEpK2N1cnJlbnRpZHggPC8qPSovIG1hdGNoaW5nSW5kZXgpIHsKKwkJY3VycmVudGlk eCs9cGFyYWdyYXBoTGVuZ3RoKGN1cnJlbnRwYXJhKyspKzE7CisJfQorCS8qIHdlIHNob3VsZCBi ZSBvbiB0aGUgcmlnaHQgc3RhcnRpbmcgcGFyYWcgbm93ICovCisJaW5kZXhmcm9tID0gKG1hdGNo aW5nSW5kZXg+PWN1cnJlbnRpZHgpID8gbWF0Y2hpbmdJbmRleCAtIGN1cnJlbnRpZHggOiBtYXRj aGluZ0luZGV4OworLy8JaWYgKG9wdGlvbnMgJiBLRWRGaW5kOjpGaW5kQmFja3dhcmRzICYmIG9w dGlvbnMgJiBLRWRGaW5kOjpGcm9tQ3Vyc29yKSBpbmRleGZyb20rKzsgLy8gZG9uJ3Qga25vdyB3 aHkgaSBuZWVkIHRoaXMKKwlwYXJhZnJvbSA9IGN1cnJlbnRwYXJhOworCS8va2REZWJ1ZygyOTQp IDw8ICJpbmRleGZyb20gOiIgPDwgaW5kZXhmcm9tIDw8ICIgcGFyYWZyb206ICIgPDwgcGFyYWZy b20gPDwgZW5kbDsKKwkKKwkvKiBjaGVjayBpZiB0aGUgc2VsZWN0aW9uIG92ZXJyaWRlcyBjdXJy ZW50IHBhcmFnICovCisgIHdoaWxlIChjdXJyZW50cGFyYSA8IHBhcmFncmFwaHMoKSAmJiBjdXJy ZW50aWR4K3BhcmFncmFwaExlbmd0aChjdXJyZW50cGFyYSkgPD0gbWF0Y2hpbmdJbmRleCttYXRj aGluZ0xlbmd0aC0xKSB7CisJCWN1cnJlbnRpZHgrPXBhcmFncmFwaExlbmd0aChjdXJyZW50cGFy YSsrKTsKKwl9CisJaWYgKGN1cnJlbnRwYXJhPjApIGluZGV4dG89bWF0Y2hpbmdJbmRleCttYXRj aGluZ0xlbmd0aC1jdXJyZW50aWR4OworCWVsc2UgaW5kZXh0bz1tYXRjaGluZ0luZGV4K21hdGNo aW5nTGVuZ3RoOworLy8JaWYgKG9wdGlvbnMgJiBLRWRGaW5kOjpGaW5kQmFja3dhcmRzICYmIG9w dGlvbnMgJiBLRWRGaW5kOjpGcm9tQ3Vyc29yKSBpbmRleHRvKys7IC8vIGRvbid0IGtub3cgd2h5 IGkgbmVlZCB0aGlzCisJcGFyYXRvPWN1cnJlbnRwYXJhOworCS8va2REZWJ1ZygyOTQpIDw8ICJp bmRleHRvIDoiIDw8IGluZGV4dG8gPDwgIiBwYXJhdG86ICIgPDwgcGFyYXRvIDw8IGVuZGw7CisK Kwl0aGlzLT5zZXRTZWxlY3Rpb24gKHBhcmFmcm9tLGluZGV4ZnJvbSxwYXJhdG8saW5kZXh0bywx KTsKKwl0aGlzLT5zZXRTZWxlY3Rpb25BdHRyaWJ1dGVzKDEsUUNvbG9yKCJsaWdodGJsdWUiKSxm YWxzZSk7CisJCit9CisKK3ZvaWQgS0VkaXQ6OmRvcmVwbGFjZSAoY29uc3QgUVN0cmluZyAmdGV4 dCwgaW50IC8qcmVwbGFjZW1lbnRJbmRleCovLCBpbnQgLypyZXBsYWNlZExlbmd0aCovLGludCAv Km1hdGNoZWRMZW5ndGgqLywgY29uc3QgUVJlY3QgJnIsIGxvbmcgb3B0aW9ucykgCit7CisJaWYg KG9wdGlvbnMgJiBLRWRGaW5kOjpTZWxlY3RlZFRleHQpIHsKKwkJdGhpcy0+cmVtb3ZlU2VsZWN0 ZWRUZXh0KCk7CQorCX0gZWxzZSBpZiAob3B0aW9ucyAmIEtFZEZpbmQ6OkZyb21DdXJzb3IpIHsK KwkJaW50IGN1cnJlbnRwYXJhPTAsY3VycmVudGlkeD0wOworCQl3aGlsZSAoY3VycmVudGlkeCtw YXJhZ3JhcGhMZW5ndGgoY3VycmVudHBhcmEpIDwgci5yaWdodCgpKSB7CisJCQljdXJyZW50aWR4 Kz1wYXJhZ3JhcGhMZW5ndGgoY3VycmVudHBhcmErKykrMTsKKwkJfQorCQkvL2tkRGVidWcoMjk0 KSA8PCAiY3VycmVudGlkeCA6ICIgPDwgY3VycmVudGlkeCA8PCBlbmRsOworCQkvL2tkRGVidWco Mjk0KSA8PCAiY3VycmVudHBhcmEgIDogIiA8PCBjdXJyZW50cGFyYSA8PCAiIHIucmlnaHQgOiAi IDw8IHIucmlnaHQoKSA8PCAicGFyYWdyYXBocygpIDogIiA8PCBwYXJhZ3JhcGhzKCkgPDwgIiBw YXJhZ3JhcGhMZW5ndGgocGFyYWdyYXBocygpKSA6ICIgPDwgcGFyYWdyYXBoTGVuZ3RoKHBhcmFn cmFwaHMoKS0xKSA8PCBlbmRsOworCQlpZiAob3B0aW9ucyAmIEtFZEZpbmQ6OkZpbmRCYWNrd2Fy ZHMpIHsKKwkJCXNldEN1cnNvclBvc2l0aW9uKDAsMCk7CisJCQl0aGlzLT5zZXRTZWxlY3Rpb24o MCwwLGN1cnJlbnRwYXJhLHIucmlnaHQoKS1jdXJyZW50aWR4KTsKKwkJCS8va2REZWJ1ZygyOTQp IDw8ICJyZW1vdmluZyB0ZXh0IDoiIDw8IHNlbGVjdGVkVGV4dCgpIDw8ICIhIiA8PCBlbmRsOwor CQkJdGhpcy0+cmVtb3ZlU2VsZWN0ZWRUZXh0KCk7CisJCQlzZXRDdXJzb3JQb3NpdGlvbigwLDAp OworCQl9IGVsc2UgeworCQkJc2V0Q3Vyc29yUG9zaXRpb24oY3VycmVudHBhcmEsci5yaWdodCgp LWN1cnJlbnRpZHgpOworCQkJdGhpcy0+c2V0U2VsZWN0aW9uKGN1cnJlbnRwYXJhLHIucmlnaHQo KS1jdXJyZW50aWR4LHBhcmFncmFwaHMoKS0xLHBhcmFncmFwaExlbmd0aChwYXJhZ3JhcGhzKCkt MSkpOworCQkJLy9rZERlYnVnKDI5NCkgPDwgInNlbGVjdGVkIHRleHQgOiAiICA8PCBzZWxlY3Rl ZFRleHQoKSA8PCBlbmRsOworCQkJdGhpcy0+cmVtb3ZlU2VsZWN0ZWRUZXh0KCk7CisJCQlzZXRD dXJzb3JQb3NpdGlvbihjdXJyZW50cGFyYSxyLnJpZ2h0KCktY3VycmVudGlkeCk7CisJCX0KKwl9 IGVsc2UgeworCQl0aGlzLT5jbGVhcigpOwogCX0KLSAgICAgIH0KLQotICAgIH0KLSAgfQotCi0g IHJldHVybiAwOwotCisJLy9rZERlYnVnKDI5NCkgPDwgImluc2VydGluZyB0ZXh0IDoiIDw8IHRl eHQgPDwgIiEiIDw8IGVuZGw7CisJdGhpcy0+aW5zZXJ0KHRleHQsZmFsc2UsdHJ1ZSxmYWxzZSk7 CiB9CiAKLQogCi1ib29sIEtFZGl0OjpyZXBlYXRTZWFyY2goKSB7Cit2b2lkIEtFZGl0OjpGaW5k TmV4dE9rICgpIHt9CiAKLSAgaWYoIXNyY2hkaWFsb2cpCi0gICAgICByZXR1cm4gZmFsc2U7Cit2 b2lkIEtFZGl0OjpGaW5kTmV4dENsb3NlICgpIHt9CiAKIAotICBpZihwYXR0ZXJuLmlzRW1wdHko KSkgLy8gdGhlcmUgd2Fzbid0IGEgcHJldmlvdXMgc2VhcmNoCi0gICAgcmV0dXJuIGZhbHNlOwot Ci0gIHNlYXJjaF9zbG90KCk7Ci0KLSAgdGhpcy0+c2V0Rm9jdXMoKTsKLSAgcmV0dXJuIHRydWU7 Ci0KLX0KLQotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8KIC8vIFJlcGxhY2UgTWV0aG9kcwpAQCAt MjQ2LDY3NSArMTk3LDY0IEBAIGJvb2wgS0VkaXQ6OnJlcGVhdFNlYXJjaCgpIHsKIAogdm9pZCBL RWRpdDo6cmVwbGFjZSgpCiB7CisJaW50IG9wdGlvbnM7CisJCiAgIGlmKCBzcmNoZGlhbG9nICE9 IDAgJiYgc3JjaGRpYWxvZy0+aXNWaXNpYmxlKCkgPT0gdHJ1ZSkKICAgewogICAgIHNyY2hkaWFs b2ctPmhpZGUoKTsKICAgfQotCi0gIGlmKCByZXBsYWNlX2RpYWxvZyA9PSAwICkKLSAgewotICAg IHJlcGxhY2VfZGlhbG9nID0gbmV3IEtFZFJlcGxhY2UoIHRoaXMsICJyZXBsYWNlX2RpYWxvZyIs IGZhbHNlICk7Ci0gICAgY29ubmVjdChyZXBsYWNlX2RpYWxvZyxTSUdOQUwoZmluZCgpKSx0aGlz LFNMT1QocmVwbGFjZV9zZWFyY2hfc2xvdCgpKSk7Ci0gICAgY29ubmVjdChyZXBsYWNlX2RpYWxv ZyxTSUdOQUwocmVwbGFjZSgpKSx0aGlzLFNMT1QocmVwbGFjZV9zbG90KCkpKTsKLSAgICBjb25u ZWN0KHJlcGxhY2VfZGlhbG9nLFNJR05BTChyZXBsYWNlQWxsKCkpLHRoaXMsU0xPVChyZXBsYWNl X2FsbF9zbG90KCkpKTsKLSAgICBjb25uZWN0KHJlcGxhY2VfZGlhbG9nLFNJR05BTChkb25lKCkp LHRoaXMsU0xPVChyZXBsYWNlZG9uZV9zbG90KCkpKTsKLSAgfQotCi0gIFFTdHJpbmcgc3RyaW5n ID0gcmVwbGFjZV9kaWFsb2ctPmdldFRleHQoKTsKLSAgcmVwbGFjZV9kaWFsb2ctPnNldFRleHQo c3RyaW5nLmlzRW1wdHkoKSA/IHBhdHRlcm4gOiBzdHJpbmcpOwotCi0KLSAgdGhpcy0+ZGVzZWxl Y3QoKTsKLSAgbGFzdF9yZXBsYWNlID0gTk9ORTsKLQotICByZXBsYWNlX2RpYWxvZy0+c2hvdygp OwotICByZXBsYWNlX2RpYWxvZy0+cmVzdWx0KCk7Ci19Ci0KLQotdm9pZCBLRWRpdDo6cmVwbGFj ZV9zbG90KCl7Ci0KLSAgaWYgKCFyZXBsYWNlX2RpYWxvZykKLSAgICByZXR1cm47Ci0KLSAgaWYo IWNhbl9yZXBsYWNlKXsKLSAgICBLTm90aWZ5Q2xpZW50OjpiZWVwKCk7Ci0gICAgcmV0dXJuOwot ICB9Ci0KLSAgaW50IGxpbmUsY29sLCBsZW5ndGg7Ci0KLSAgUVN0cmluZyBzdHJpbmcgPSByZXBs YWNlX2RpYWxvZy0+Z2V0UmVwbGFjZVRleHQoKTsKLSAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgp OwotCi0gIHRoaXMtPmN1dCgpOwotCi0gIGdldEN1cnNvclBvc2l0aW9uKCZsaW5lLCZjb2wpOwot Ci0gIGluc2VydEF0KHN0cmluZyxsaW5lLGNvbCk7Ci0gIHNldE1vZGlmaWVkKHRydWUpOwotICBj YW5fcmVwbGFjZSA9IEZBTFNFOwotCi0gIHNldEN1cnNvclBvc2l0aW9uKGxpbmUsY29sKTsKLSAg Zm9yKCBpbnQgayA9IDA7IGsgPCBsZW5ndGg7IGsrKyl7Ci0gICAgY3Vyc29yUmlnaHQoVFJVRSk7 Ci0gIH0KLQotfQotCi12b2lkIEtFZGl0OjpyZXBsYWNlX2FsbF9zbG90KCl7Ci0KLSAgaWYgKCFy ZXBsYWNlX2RpYWxvZykKLSAgICByZXR1cm47Ci0KLSAgUVN0cmluZyB0b19maW5kX3N0cmluZyA9 IHJlcGxhY2VfZGlhbG9nLT5nZXRUZXh0KCk7Ci0gIGdldEN1cnNvclBvc2l0aW9uKCZyZXBsYWNl X2FsbF9saW5lLCZyZXBsYWNlX2FsbF9jb2wpOwotCi0gIC8vIHJlcGxhY2VfZGlhbG9nLT5nZXRf ZGlyZWN0aW9uKCkgaXMgdHJ1ZSBpZiBzZWFyY2hpbmcgYmFja3dhcmQKLQotICBpZiAobGFzdF9y ZXBsYWNlICE9IE5PTkUgJiYgcmVwbGFjZV9kaWFsb2ctPmdldF9kaXJlY3Rpb24oKSl7Ci0gICAg cmVwbGFjZV9hbGxfY29sID0gcmVwbGFjZV9hbGxfY29sICAtIHBhdHRlcm4ubGVuZ3RoKCkgLSAx IDsKLSAgfQotCi0gIGRlc2VsZWN0KCk7Ci0KLWFnYWluOgotCi0gIHNldEF1dG9VcGRhdGUoRkFM U0UpOwotICBpbnQgcmVzdWx0ID0gMTsKLQotICB3aGlsZShyZXN1bHQpewotCi0gICAgcmVzdWx0 ID0gZG9SZXBsYWNlKHRvX2ZpbmRfc3RyaW5nLCByZXBsYWNlX2RpYWxvZy0+Y2FzZV9zZW5zaXRp dmUoKSwKLQkJICAgICAgIEZBTFNFLCAoIXJlcGxhY2VfZGlhbG9nLT5nZXRfZGlyZWN0aW9uKCkp LAotCQkgICAgICAgcmVwbGFjZV9hbGxfbGluZSxyZXBsYWNlX2FsbF9jb2wsVFJVRSk7Ci0KLSAg fQotCi0gIHNldEF1dG9VcGRhdGUoVFJVRSk7Ci0gIHVwZGF0ZSgpOwotCi0gIGlmKCFyZXBsYWNl X2RpYWxvZy0+Z2V0X2RpcmVjdGlvbigpKXsgLy8gZm9yd2FyZCBzZWFyY2gKLQotICAgIGludCBx dWVyeSA9IEtNZXNzYWdlQm94OjpxdWVzdGlvblllc05vKAotCQkJc3JjaGRpYWxvZywKLSAgICAg ICAgICAgICAgICAgICAgICAgIGkxOG4oIkVuZCBvZiBkb2N1bWVudCByZWFjaGVkLlxuIlwKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRpbnVlIGZyb20gdGhlIGJlZ2lubmluZz8i KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4oIkZpbmQiKSk7Ci0gICAgaWYgKHF1ZXJ5 ID09IEtNZXNzYWdlQm94OjpZZXMpewotICAgICAgcmVwbGFjZV9hbGxfbGluZSA9IDA7Ci0gICAg ICByZXBsYWNlX2FsbF9jb2wgPSAwOwotICAgICAgZ290byBhZ2FpbjsKLSAgICB9Ci0gIH0KLSAg ZWxzZXsgLy9iYWNrd2FyZCBzZWFyY2gKLQotICAgIGludCBxdWVyeSA9IEtNZXNzYWdlQm94Ojpx dWVzdGlvblllc05vKAotCQkJc3JjaGRpYWxvZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGkx OG4oIkJlZ2lubmluZyBvZiBkb2N1bWVudCByZWFjaGVkLlxuIlwKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIkNvbnRpbnVlIGZyb20gdGhlIGVuZD8iKSwKLSAgICAgICAgICAgICAgICAg ICAgICAgIGkxOG4oIkZpbmQiKSk7Ci0gICAgaWYgKHF1ZXJ5ID09IEtNZXNzYWdlQm94OjpZZXMp ewotICAgICAgUVN0cmluZyBzdHJpbmcgPSB0ZXh0TGluZSggbnVtTGluZXMoKSAtIDEgKTsKLSAg ICAgIHJlcGxhY2VfYWxsX2xpbmUgPSBudW1MaW5lcygpIC0gMTsKLSAgICAgIHJlcGxhY2VfYWxs X2NvbCAgPSBzdHJpbmcubGVuZ3RoKCk7Ci0gICAgICBsYXN0X3JlcGxhY2UgPSBCQUNLV0FSRDsK LSAgICAgIGdvdG8gYWdhaW47Ci0gICAgfQotICB9Ci0KLSAgZW1pdCBDdXJzb3JQb3NpdGlvbkNo YW5nZWQoKTsKLQotfQotCi0KLXZvaWQgS0VkaXQ6OnJlcGxhY2Vfc2VhcmNoX3Nsb3QoKXsKLQot ICBpbnQgbGluZSwgY29sOwotCi0gIGlmICghcmVwbGFjZV9kaWFsb2cpCi0gICAgcmV0dXJuOwot Ci0gIFFTdHJpbmcgdG9fZmluZF9zdHJpbmcgPSByZXBsYWNlX2RpYWxvZy0+Z2V0VGV4dCgpOwot ICBnZXRDdXJzb3JQb3NpdGlvbigmbGluZSwmY29sKTsKLQotICAvLyByZXBsYWNlX2RpYWxvZy0+ Z2V0X2RpcmVjdGlvbigpIGlzIHRydWUgaWYgc2VhcmNoaW5nIGJhY2t3YXJkCi0KLSAgLy9wcmlu dGYoImNvbCAlZCBsZW5ndGggJWRcbiIsY29sLCBwYXR0ZXJuLmxlbmd0aCgpKTsKLQotICBpZiAo bGFzdF9yZXBsYWNlICE9IE5PTkUgJiYgcmVwbGFjZV9kaWFsb2ctPmdldF9kaXJlY3Rpb24oKSl7 Ci0gICAgY29sID0gY29sICAtIHBhdHRlcm4ubGVuZ3RoKCkgLTE7Ci0gICAgaWYgKGNvbCA8IDAg KSB7Ci0gICAgICBpZihsaW5lICE9MCl7Ci0JY29sID0gdGV4dExpbmUobGluZSAtIDEpLmxlbmd0 aCgpOwotCWxpbmUgLS07Ci0gICAgICB9Ci0gICAgICBlbHNlewotCi0gICAgICAgIGludCBxdWVy eSA9IEtNZXNzYWdlQm94OjpxdWVzdGlvblllc05vKAotCQkJcmVwbGFjZV9kaWFsb2csCi0gICAg ICAgICAgICAgICAgICAgICAgICBpMThuKCJCZWdpbm5pbmcgb2YgZG9jdW1lbnQgcmVhY2hlZC5c biJcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250aW51ZSBmcm9tIHRoZSBlbmQ/ IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBpMThuKCJSZXBsYWNlIikpOwotICAgICAgICBp ZiAocXVlcnkgPT0gS01lc3NhZ2VCb3g6Olllcyl7Ci0JICBRU3RyaW5nIHN0cmluZyA9IHRleHRM aW5lKCBudW1MaW5lcygpIC0gMSApOwotCSAgbGluZSA9IG51bUxpbmVzKCkgLSAxOwotCSAgY29s ICA9IHN0cmluZy5sZW5ndGgoKTsKLQkgIGxhc3RfcmVwbGFjZSA9IEJBQ0tXQVJEOwotCX0KLSAg ICAgIH0KLSAgICB9Ci0gIH0KLQotYWdhaW46Ci0KLSAgLy8gIHByaW50ZigiQ29sICVkIFxuIixj b2wpOwotCi0gIGludCAgcmVzdWx0ID0gZG9SZXBsYWNlKHRvX2ZpbmRfc3RyaW5nLCByZXBsYWNl X2RpYWxvZy0+Y2FzZV9zZW5zaXRpdmUoKSwKLQkJCSBGQUxTRSwgKCFyZXBsYWNlX2RpYWxvZy0+ Z2V0X2RpcmVjdGlvbigpKSwgbGluZSwgY29sLCBGQUxTRSApOwotCi0gIGlmKHJlc3VsdCA9PSAw KXsKLSAgICBpZighcmVwbGFjZV9kaWFsb2ctPmdldF9kaXJlY3Rpb24oKSl7IC8vIGZvcndhcmQg c2VhcmNoCi0KLSAgICAgaW50IHF1ZXJ5ID0gS01lc3NhZ2VCb3g6OnF1ZXN0aW9uWWVzTm8oCi0J CQlyZXBsYWNlX2RpYWxvZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4oIkVuZCBvZiBk b2N1bWVudCByZWFjaGVkLlxuIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRp bnVlIGZyb20gdGhlIGJlZ2lubmluZz8iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4o IlJlcGxhY2UiKSk7Ci0gICAgIGlmIChxdWVyeSA9PSBLTWVzc2FnZUJveDo6WWVzKXsKLQlsaW5l ID0gMDsKLQljb2wgPSAwOwotCWdvdG8gYWdhaW47Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2V7 IC8vYmFja3dhcmQgc2VhcmNoCi0KLSAgICAgaW50IHF1ZXJ5ID0gS01lc3NhZ2VCb3g6OnF1ZXN0 aW9uWWVzTm8oCi0JCQlyZXBsYWNlX2RpYWxvZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGkx OG4oIkJlZ2lubmluZyBvZiBkb2N1bWVudCByZWFjaGVkLlxuIlwKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIkNvbnRpbnVlIGZyb20gdGhlIGVuZD8iKSwKLSAgICAgICAgICAgICAgICAg ICAgICAgIGkxOG4oIlJlcGxhY2UiKSk7Ci0gICAgICBpZiAocXVlcnkgPT0gS01lc3NhZ2VCb3g6 Olllcyl7Ci0JUVN0cmluZyBzdHJpbmcgPSB0ZXh0TGluZSggbnVtTGluZXMoKSAtIDEgKTsKLQls aW5lID0gbnVtTGluZXMoKSAtIDE7Ci0JY29sICA9IHN0cmluZy5sZW5ndGgoKTsKLQlsYXN0X3Jl cGxhY2UgPSBCQUNLV0FSRDsKLQlnb3RvIGFnYWluOwotICAgICAgfQotICAgIH0KLSAgfQotICBl bHNlewotCi0gICAgZW1pdCBDdXJzb3JQb3NpdGlvbkNoYW5nZWQoKTsKLSAgfQotfQotCi0KLQot dm9pZCBLRWRpdDo6cmVwbGFjZWRvbmVfc2xvdCgpewotCi0gIGlmICghcmVwbGFjZV9kaWFsb2cp Ci0gICAgcmV0dXJuOwotCi0gIHJlcGxhY2VfZGlhbG9nLT5oaWRlKCk7Ci0gIC8vICByZXBsYWNl X2RpYWxvZy0+Y2xlYXJGb2N1cygpOwotCi0gIHRoaXMtPnNldEZvY3VzKCk7Ci0KLSAgbGFzdF9y ZXBsYWNlID0gTk9ORTsKLSAgY2FuX3JlcGxhY2UgID0gRkFMU0U7Ci0KLX0KLQotCi0KLWludCBL RWRpdDo6ZG9SZXBsYWNlKFFTdHJpbmcgc19wYXR0ZXJuLCBib29sIGNhc2Vfc2Vuc2l0aXZlLAot CSAgIGJvb2wgd2lsZGNhcmQsIGJvb2wgZm9yd2FyZCwgaW50IGxpbmUsIGludCBjb2wsIGJvb2wg cmVwbGFjZV9hbGwpewotCi0KLSAgKHZvaWQpIHdpbGRjYXJkOyAvLyByZXNlcnZlZCBmb3IgcG9z c2libGUgZXh0ZW5zaW9uIHRvIHJlZ2V4Ci0KLSAgaW50IGxpbmVfY291bnRlciwgbGVuZ3RoOwot ICBpbnQgcG9zID0gLTE7Ci0KLSAgUVN0cmluZyBzdHJpbmc7Ci0gIFFTdHJpbmcgc3RyaW5nbmV3 OwotICBRU3RyaW5nIHJlcGxhY2VtZW50OwotCi0gIHJlcGxhY2VtZW50ID0gcmVwbGFjZV9kaWFs b2ctPmdldFJlcGxhY2VUZXh0KCk7Ci0gIGxpbmVfY291bnRlciA9IGxpbmU7Ci0gIHJlcGxhY2Vf YWxsX2NvbCA9IGNvbDsKLQotICBpZihmb3J3YXJkKXsKLQotICAgIGludCBudW1fbGluZXMgPSBu dW1MaW5lcygpOwotCi0gICAgd2hpbGUgKGxpbmVfY291bnRlciA8IG51bV9saW5lcyl7Ci0KLSAg ICAgIHN0cmluZyA9ICIiOwotICAgICAgc3RyaW5nID0gdGV4dExpbmUobGluZV9jb3VudGVyKTsK LQotICAgICAgaWYgKHJlcGxhY2VfYWxsKXsKLQlwb3MgPSBzdHJpbmcuZmluZChzX3BhdHRlcm4s IHJlcGxhY2VfYWxsX2NvbCwgY2FzZV9zZW5zaXRpdmUpOwotICAgICAgfQotICAgICAgZWxzZXsK LQlwb3MgPSBzdHJpbmcuZmluZChzX3BhdHRlcm4sIGxpbmVfY291bnRlciA9PSBsaW5lID8gY29s IDogMCwgY2FzZV9zZW5zaXRpdmUpOwotICAgICAgfQotCi0gICAgICBpZiAocG9zID09IC0xICl7 Ci0JbGluZV9jb3VudGVyICsrOwotCXJlcGxhY2VfYWxsX2NvbCA9IDA7Ci0JcmVwbGFjZV9hbGxf bGluZSA9IGxpbmVfY291bnRlcjsKLSAgICAgIH0KLQotICAgICAgaWYoIHBvcyAhPSAtMSl7Ci0K LQlsZW5ndGggPSBzX3BhdHRlcm4ubGVuZ3RoKCk7Ci0KLQlpZihyZXBsYWNlX2FsbCl7IC8vIGF1 dG9tYXRpYwotCi0JICBzdHJpbmduZXcgPSBzdHJpbmcuY29weSgpOwotCSAgc3RyaW5nbmV3LnJl cGxhY2UocG9zLGxlbmd0aCxyZXBsYWNlbWVudCk7Ci0KLQkgIHJlbW92ZUxpbmUobGluZV9jb3Vu dGVyKTsKLQkgIGluc2VydExpbmUoc3RyaW5nbmV3LGxpbmVfY291bnRlcik7Ci0KLQkgIHJlcGxh Y2VfYWxsX2NvbCA9IHJlcGxhY2VfYWxsX2NvbCArIHJlcGxhY2VtZW50Lmxlbmd0aCgpOwotCSAg cmVwbGFjZV9hbGxfbGluZSA9IGxpbmVfY291bnRlcjsKLQotCSAgc2V0TW9kaWZpZWQodHJ1ZSk7 Ci0JfQotCWVsc2V7IC8vIGludGVyYWN0aXZlCi0KLQkgIHNldEN1cnNvclBvc2l0aW9uKCBsaW5l X2NvdW50ZXIgLCBwb3MsIEZBTFNFICk7Ci0KLQkgIGZvcihpbnQgbCA9IDAgOyBsIDwgbGVuZ3Ro OyBsKyspewotCSAgICBjdXJzb3JSaWdodChUUlVFKTsKLQkgIH0KLQotCSAgc2V0Q3Vyc29yUG9z aXRpb24oIGxpbmVfY291bnRlciAsIHBvcyArIGxlbmd0aCwgVFJVRSApOwotCSAgcGF0dGVybiA9 IHNfcGF0dGVybjsKLQkgIGxhc3RfcmVwbGFjZSA9IEZPUldBUkQ7Ci0JICBjYW5fcmVwbGFjZSA9 IFRSVUU7Ci0KLQkgIHJldHVybiAxOwotCi0JfQotCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIGVs c2V7IC8vIHNlYXJjaGluZyBiYWNrd2FyZHMKLQotICAgIHdoaWxlKGxpbmVfY291bnRlciA+PSAw KXsKLQotICAgICAgc3RyaW5nID0gIiI7Ci0gICAgICBzdHJpbmcgPSB0ZXh0TGluZShsaW5lX2Nv dW50ZXIpOwotCi0gICAgICBpbnQgbGluZV9sZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0KLSAg ICAgIGlmKCByZXBsYWNlX2FsbCApewotICAgICAgCXBvcyA9IHN0cmluZy5maW5kUmV2KHNfcGF0 dGVybiwgcmVwbGFjZV9hbGxfY29sICwgY2FzZV9zZW5zaXRpdmUpOwotICAgICAgfQotICAgICAg ZWxzZXsKLQlwb3MgPSBzdHJpbmcuZmluZFJldihzX3BhdHRlcm4sCi0JCQkgICBsaW5lID09IGxp bmVfY291bnRlciA/IGNvbCA6IGxpbmVfbGVuZ3RoICwgY2FzZV9zZW5zaXRpdmUpOwotICAgICAg fQotCi0gICAgICBpZiAocG9zID09IC0xICl7Ci0JbGluZV9jb3VudGVyIC0tOwotCi0JaWYobGlu ZV9jb3VudGVyID49IDApewotCSAgc3RyaW5nID0gIiI7Ci0JICBzdHJpbmcgPSB0ZXh0TGluZShs aW5lX2NvdW50ZXIpOwotCSAgcmVwbGFjZV9hbGxfY29sID0gc3RyaW5nLmxlbmd0aCgpOwotCi0J fQotCXJlcGxhY2VfYWxsX2xpbmUgPSBsaW5lX2NvdW50ZXI7Ci0gICAgICB9Ci0KLQotICAgICAg aWYgKHBvcyAhPSAtMSl7Ci0JbGVuZ3RoID0gc19wYXR0ZXJuLmxlbmd0aCgpOwotCi0JaWYocmVw bGFjZV9hbGwpeyAvLyBhdXRvbWF0aWMKLQotCSAgc3RyaW5nbmV3ID0gc3RyaW5nLmNvcHkoKTsK LQkgIHN0cmluZ25ldy5yZXBsYWNlKHBvcyxsZW5ndGgscmVwbGFjZW1lbnQpOwotCi0JICByZW1v dmVMaW5lKGxpbmVfY291bnRlcik7Ci0JICBpbnNlcnRMaW5lKHN0cmluZ25ldyxsaW5lX2NvdW50 ZXIpOwotCi0JICByZXBsYWNlX2FsbF9jb2wgPSByZXBsYWNlX2FsbF9jb2wgLSByZXBsYWNlbWVu dC5sZW5ndGgoKTsKLQkgIHJlcGxhY2VfYWxsX2xpbmUgPSBsaW5lX2NvdW50ZXI7Ci0KLQkgIHNl dE1vZGlmaWVkKHRydWUpOwotCi0JfQotCWVsc2V7IC8vIGludGVyYWN0aXZlCi0KLQkgIC8vCSAg cHJpbnRmKCJsaW5lX2NvdW50ZXIgJWQgcG9zICVkIGNvbCAlZFxuIixsaW5lX2NvdW50ZXIsIHBv cyxjb2wpOwotCSAgaWYoICEgKGxpbmUgPT0gbGluZV9jb3VudGVyICYmIHBvcyA+IGNvbCApICl7 Ci0KLQkgICAgc2V0Q3Vyc29yUG9zaXRpb24obGluZV9jb3VudGVyICxwb3MgLEZBTFNFICk7Ci0K LQkgICAgZm9yKGludCBsID0gMCA7IGwgPCBsZW5ndGg7IGwrKyl7Ci0JICAgICAgY3Vyc29yUmln aHQoVFJVRSk7Ci0JICAgIH0KLQotCSAgICBzZXRDdXJzb3JQb3NpdGlvbihsaW5lX2NvdW50ZXIg LHBvcyArIGxlbmd0aCAsVFJVRSApOwotCSAgICBwYXR0ZXJuID0gc19wYXR0ZXJuOwotCi0JICAg IGxhc3RfcmVwbGFjZSA9IEJBQ0tXQVJEOwotCSAgICBjYW5fcmVwbGFjZSA9IFRSVUU7Ci0KLQkg ICAgcmV0dXJuIDE7Ci0JICB9Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiAw OwotCi19Ci0KLQotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBGaW5kIERpYWxvZwotLy8KLQot Y2xhc3MgS0VkRmluZDo6S0VkRmluZFByaXZhdGUKLXsKLXB1YmxpYzoKLSAgICBLRWRGaW5kUHJp dmF0ZSggUVdpZGdldCAqcGFyZW50ICkgewotCWNvbWJvID0gbmV3IEtIaXN0b3J5Q29tYm8oIHBh cmVudCwgInZhbHVlIiApOwotCWNvbWJvLT5zZXRNYXhDb3VudCggMjAgKTsgLy8ganVzdCBzb21l IGRlZmF1bHQKLSAgICB9Ci0gICAgfktFZEZpbmRQcml2YXRlKCkgewotCWRlbGV0ZSBjb21ibzsK LSAgICB9Ci0KLSAgICBLSGlzdG9yeUNvbWJvICpjb21ibzsKLX07Ci0KLQotS0VkRmluZDo6S0Vk RmluZCggUVdpZGdldCAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLCBib29sIG1vZGFsICkKLSAg OktEaWFsb2dCYXNlKCBwYXJlbnQsIG5hbWUsIG1vZGFsLCBpMThuKCJGaW5kIiksCi0JCW1vZGFs ID8gVXNlcjF8Q2FuY2VsIDogVXNlcjF8Q2xvc2UsIFVzZXIxLCBmYWxzZSwgaTE4bigiJkZpbmQi KSApCi17Ci0gIHNldFdGbGFncyggV1R5cGVfVG9wTGV2ZWwgKTsKLQotICBRV2lkZ2V0ICpwYWdl ID0gbmV3IFFXaWRnZXQoIHRoaXMgKTsKLSAgc2V0TWFpbldpZGdldChwYWdlKTsKLSAgUVZCb3hM YXlvdXQgKnRvcExheW91dCA9IG5ldyBRVkJveExheW91dCggcGFnZSwgMCwgc3BhY2luZ0hpbnQo KSApOwotCi0gIGQgPSBuZXcgS0VkRmluZFByaXZhdGUoIHBhZ2UgKTsKLQotICBRU3RyaW5nIHRl eHQgPSBpMThuKCJGaW5kOiIpOwotICBRTGFiZWwgKmxhYmVsID0gbmV3IFFMYWJlbCggdGV4dCwg cGFnZSAsICJmaW5kIiApOwotICB0b3BMYXlvdXQtPmFkZFdpZGdldCggbGFiZWwgKTsKLQotICBk LT5jb21iby0+c2V0TWluaW11bVdpZHRoKGZvbnRNZXRyaWNzKCkubWF4V2lkdGgoKSoyMCk7Ci0g IGQtPmNvbWJvLT5zZXRGb2N1cygpOwotCi0gIGNvbm5lY3QoZC0+Y29tYm8sIFNJR05BTCh0ZXh0 Q2hhbmdlZCAoIGNvbnN0IFFTdHJpbmcgJiApKSwKLSAgICAgICAgICB0aGlzLFNMT1QodGV4dFNl YXJjaENoYW5nZWQgKCBjb25zdCBRU3RyaW5nICYgKSkpOwotCi0gIHRvcExheW91dC0+YWRkV2lk Z2V0KGQtPmNvbWJvKTsKLQotICBncm91cCA9IG5ldyBRVkJ1dHRvbkdyb3VwKCBpMThuKCJPcHRp b25zIiksIHBhZ2UgKTsKLSAgdG9wTGF5b3V0LT5hZGRXaWRnZXQoIGdyb3VwICk7Ci0KLSAgUUhC b3gqIHJvdzEgPSBuZXcgUUhCb3goIGdyb3VwICk7Ci0gIAotICB0ZXh0ID0gaTE4bigiQ2FzZSAm U2Vuc2l0aXZlIik7Ci0gIHNlbnNpdGl2ZSA9IG5ldyBRQ2hlY2tCb3goIHRleHQsIHJvdzEsICJj YXNlIik7Ci0gIHRleHQgPSBpMThuKCJGaW5kICZCYWNrd2FyZHMiKTsKLSAgZGlyZWN0aW9uID0g bmV3IFFDaGVja0JveCggdGV4dCwgcm93MSwgImRpcmVjdGlvbiIgKTsKLQotICAKLSAgZW5hYmxl QnV0dG9uKCBLRGlhbG9nQmFzZTo6VXNlcjEsICFkLT5jb21iby0+Y3VycmVudFRleHQoKS5pc0Vt cHR5KCkgKTsKLQotICBpZiAoICFtb2RhbCApCi0gICAgY29ubmVjdCggdGhpcywgU0lHTkFMKCBj bG9zZUNsaWNrZWQoKSApLCB0aGlzLCBTTE9UKCBzbG90Q2FuY2VsKCkgKSApOwotfQotCi1LRWRG aW5kOjp+S0VkRmluZCgpCi17Ci0gICAgZGVsZXRlIGQ7Ci19Ci0KLXZvaWQgS0VkRmluZDo6dGV4 dFNlYXJjaENoYW5nZWQgKCBjb25zdCBRU3RyaW5nICZ0ZXh0ICkKLXsKLSAgIGVuYWJsZUJ1dHRv biggS0RpYWxvZ0Jhc2U6OlVzZXIxLCAhdGV4dC5pc0VtcHR5KCkgKTsKLX0KLQotdm9pZCBLRWRG aW5kOjpzbG90Q2FuY2VsKCB2b2lkICkKLXsKLSAgZW1pdCBkb25lKCk7Ci0gIGQtPmNvbWJvLT5j bGVhckVkaXQoKTsKLSAgS0RpYWxvZ0Jhc2U6OnNsb3RDYW5jZWwoKTsKLX0KLQotdm9pZCBLRWRG aW5kOjpzbG90VXNlcjEoIHZvaWQgKQotewotICBpZiggIWQtPmNvbWJvLT5jdXJyZW50VGV4dCgp LmlzRW1wdHkoKSApCi0gIHsKLSAgICBkLT5jb21iby0+YWRkVG9IaXN0b3J5KCBkLT5jb21iby0+ Y3VycmVudFRleHQoKSApOwotICAgIGVtaXQgc2VhcmNoKCk7Ci0gIH0KLX0KLQotCi1RU3RyaW5n IEtFZEZpbmQ6OmdldFRleHQoKSBjb25zdAotewotICAgIHJldHVybiBkLT5jb21iby0+Y3VycmVu dFRleHQoKTsKLX0KLQotCi12b2lkIEtFZEZpbmQ6OnNldFRleHQoUVN0cmluZyBzdHJpbmcpCi17 Ci0gIGQtPmNvbWJvLT5zZXRFZGl0VGV4dChzdHJpbmcpOwotICBkLT5jb21iby0+bGluZUVkaXQo KS0+c2VsZWN0QWxsKCk7Ci19Ci0KLXZvaWQgS0VkRmluZDo6c2V0Q2FzZVNlbnNpdGl2ZSggYm9v bCBiICkKLXsKLSAgc2Vuc2l0aXZlLT5zZXRDaGVja2VkKCBiICk7Ci19Ci0KLWJvb2wgS0VkRmlu ZDo6Y2FzZV9zZW5zaXRpdmUoKSBjb25zdAotewotICByZXR1cm4gc2Vuc2l0aXZlLT5pc0NoZWNr ZWQoKTsKLX0KLQotdm9pZCBLRWRGaW5kOjpzZXREaXJlY3Rpb24oIGJvb2wgYiApCi17Ci0gIGRp cmVjdGlvbi0+c2V0Q2hlY2tlZCggYiApOwotfQotCi1ib29sIEtFZEZpbmQ6OmdldF9kaXJlY3Rp b24oKSBjb25zdAotewotICByZXR1cm4gZGlyZWN0aW9uLT5pc0NoZWNrZWQoKTsKLX0KLQotS0hp c3RvcnlDb21ibyAqIEtFZEZpbmQ6OnNlYXJjaENvbWJvKCkgY29uc3QKLXsKLSAgICByZXR1cm4g ZC0+Y29tYm87Ci19Ci0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICBSZXBsYWNlIERpYWxvZwot Ly8KLQotY2xhc3MgS0VkUmVwbGFjZTo6S0VkUmVwbGFjZVByaXZhdGUKLXsKLXB1YmxpYzoKLSAg ICBLRWRSZXBsYWNlUHJpdmF0ZSggUVdpZGdldCAqcGFyZW50ICkgewotCXNlYXJjaENvbWJvID0g bmV3IEtIaXN0b3J5Q29tYm8oIHBhcmVudCwgInZhbHVlIiApOwotCXJlcGxhY2VDb21ibyA9IG5l dyBLSGlzdG9yeUNvbWJvKCBwYXJlbnQsICJyZXBsYWNlX3ZhbHVlIiApOwotCi0Jc2VhcmNoQ29t Ym8tPnNldE1heENvdW50KCAyMCApOyAvLyBqdXN0IHNvbWUgZGVmYXVsdHMKLQlyZXBsYWNlQ29t Ym8tPnNldE1heENvdW50KCAyMCApOwotICAgIH0KLSAgICB+S0VkUmVwbGFjZVByaXZhdGUoKSB7 Ci0JZGVsZXRlIHNlYXJjaENvbWJvOwotCWRlbGV0ZSByZXBsYWNlQ29tYm87Ci0gICAgfQotCi0g ICAgS0hpc3RvcnlDb21ibyAqc2VhcmNoQ29tYm8sICpyZXBsYWNlQ29tYm87Ci19OwotCi1LRWRS ZXBsYWNlOjpLRWRSZXBsYWNlKCBRV2lkZ2V0ICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsIGJv b2wgbW9kYWwgKQotICA6S0RpYWxvZ0Jhc2UoIHBhcmVudCwgbmFtZSwgbW9kYWwsIGkxOG4oIlJl cGxhY2UiKSwKLQkJbW9kYWwgPyBVc2VyM3xVc2VyMnxVc2VyMXxDYW5jZWwgOiBVc2VyM3xVc2Vy MnxVc2VyMXxDbG9zZSwKLSAgICAgICAgICAgICAgICBVc2VyMywgZmFsc2UsCi0JCWkxOG4oIlJl cGxhY2UgJkFsbCIpLCBpMThuKCImUmVwbGFjZSIpLCBpMThuKCImRmluZCIpICkKLXsKLSAgc2V0 V0ZsYWdzKCBXVHlwZV9Ub3BMZXZlbCApOwotCi0gIHNldEJ1dHRvbkJveE9yaWVudGF0aW9uKCBW ZXJ0aWNhbCApOwotCi0gIFFGcmFtZSAqcGFnZSA9IG1ha2VNYWluV2lkZ2V0KCk7Ci0gIFFWQm94 TGF5b3V0ICp0b3BMYXlvdXQgPSBuZXcgUVZCb3hMYXlvdXQoIHBhZ2UsIDAsIHNwYWNpbmdIaW50 KCkgKTsKLQotICBkID0gbmV3IEtFZFJlcGxhY2VQcml2YXRlKCBwYWdlICk7Ci0KLSAgUVN0cmlu ZyB0ZXh0ID0gaTE4bigiRmluZDoiKTsKLSAgUUxhYmVsICpsYWJlbCA9IG5ldyBRTGFiZWwoIHRl eHQsIHBhZ2UsICJmaW5kIiApOwotICB0b3BMYXlvdXQtPmFkZFdpZGdldCggbGFiZWwgKTsKLQot ICBkLT5zZWFyY2hDb21iby0+c2V0TWluaW11bVdpZHRoKGZvbnRNZXRyaWNzKCkubWF4V2lkdGgo KSoyMCk7Ci0gIGQtPnNlYXJjaENvbWJvLT5zZXRGb2N1cygpOwotICB0b3BMYXlvdXQtPmFkZFdp ZGdldChkLT5zZWFyY2hDb21ibyk7Ci0KLSAgdGV4dCA9IGkxOG4oIlJlcGxhY2Ugd2l0aDoiKTsK LSAgbGFiZWwgPSBuZXcgUUxhYmVsKCB0ZXh0LCBwYWdlLCAicmVwbGFjZSIgKTsKLSAgdG9wTGF5 b3V0LT5hZGRXaWRnZXQoIGxhYmVsICk7Ci0KLSAgZC0+cmVwbGFjZUNvbWJvLT5zZXRNaW5pbXVt V2lkdGgoZm9udE1ldHJpY3MoKS5tYXhXaWR0aCgpKjIwKTsKLSAgdG9wTGF5b3V0LT5hZGRXaWRn ZXQoZC0+cmVwbGFjZUNvbWJvKTsKLQotICBjb25uZWN0KGQtPnNlYXJjaENvbWJvLCBTSUdOQUwo dGV4dENoYW5nZWQgKCBjb25zdCBRU3RyaW5nICYgKSksCi0gICAgICAgICAgdGhpcyxTTE9UKHRl eHRTZWFyY2hDaGFuZ2VkICggY29uc3QgUVN0cmluZyAmICkpKTsKLQotICBRQnV0dG9uR3JvdXAg Kmdyb3VwID0gbmV3IFFCdXR0b25Hcm91cCggaTE4bigiT3B0aW9ucyIpLCBwYWdlICk7Ci0gIHRv cExheW91dC0+YWRkV2lkZ2V0KCBncm91cCApOwotCi0gIFFHcmlkTGF5b3V0ICpnYm94ID0gbmV3 IFFHcmlkTGF5b3V0KCBncm91cCwgMywgMiwgc3BhY2luZ0hpbnQoKSApOwotICBnYm94LT5hZGRS b3dTcGFjaW5nKCAwLCBmb250TWV0cmljcygpLmxpbmVTcGFjaW5nKCkgKTsKLQotICB0ZXh0ID0g aTE4bigiQ2FzZSAmU2Vuc2l0aXZlIik7Ci0gIHNlbnNpdGl2ZSA9IG5ldyBRQ2hlY2tCb3goIHRl eHQsIGdyb3VwLCAiY2FzZSIpOwotICB0ZXh0ID0gaTE4bigiRmluZCAmQmFja3dhcmRzIik7Ci0g IGRpcmVjdGlvbiA9IG5ldyBRQ2hlY2tCb3goIHRleHQsIGdyb3VwLCAiZGlyZWN0aW9uIiApOwot ICBnYm94LT5hZGRXaWRnZXQoIHNlbnNpdGl2ZSwgMSwgMCApOwotICBnYm94LT5hZGRXaWRnZXQo IGRpcmVjdGlvbiwgMSwgMSApOwotICBnYm94LT5zZXRSb3dTdHJldGNoKCAyLCAxMCApOwotfQot Ci0KLUtFZFJlcGxhY2U6On5LRWRSZXBsYWNlKCkKLXsKLSAgICBkZWxldGUgZDsKLX0KLQotdm9p ZCBLRWRSZXBsYWNlOjp0ZXh0U2VhcmNoQ2hhbmdlZCAoIGNvbnN0IFFTdHJpbmcgJnRleHQgKQot ewotICAgIGJvb2wgc3RhdGU9dGV4dC5pc0VtcHR5KCk7Ci0gICAgZW5hYmxlQnV0dG9uKCBLRGlh bG9nQmFzZTo6VXNlcjEsICFzdGF0ZSApOwotICAgIGVuYWJsZUJ1dHRvbiggS0RpYWxvZ0Jhc2U6 OlVzZXIyLCAhc3RhdGUgKTsKLSAgICBlbmFibGVCdXR0b24oIEtEaWFsb2dCYXNlOjpVc2VyMywg IXN0YXRlICk7Ci19Ci0KLXZvaWQgS0VkUmVwbGFjZTo6c2xvdENhbmNlbCggdm9pZCApCi17Ci0g IGVtaXQgZG9uZSgpOwotICBkLT5zZWFyY2hDb21iby0+Y2xlYXJFZGl0KCk7Ci0gIGQtPnJlcGxh Y2VDb21iby0+Y2xlYXJFZGl0KCk7Ci0gIEtEaWFsb2dCYXNlOjpzbG90Q2FuY2VsKCk7Ci19Ci0K LXZvaWQgS0VkUmVwbGFjZTo6c2xvdENsb3NlKCB2b2lkICkKLXsKLSAgc2xvdENhbmNlbCgpOwot fQotCi12b2lkIEtFZFJlcGxhY2U6OnNsb3RVc2VyMSggdm9pZCApCi17Ci0gICAgaWYoICFkLT5z ZWFyY2hDb21iby0+Y3VycmVudFRleHQoKS5pc0VtcHR5KCkgKQotICAgIHsKLSAgICAgICAgZC0+ cmVwbGFjZUNvbWJvLT5hZGRUb0hpc3RvcnkoIGQtPnJlcGxhY2VDb21iby0+Y3VycmVudFRleHQo KSApOwotICAgICAgICBlbWl0IHJlcGxhY2VBbGwoKTsKLSAgICB9Ci19Ci0KLQotdm9pZCBLRWRS ZXBsYWNlOjpzbG90VXNlcjIoIHZvaWQgKQotewotICAgIGlmKCAhZC0+c2VhcmNoQ29tYm8tPmN1 cnJlbnRUZXh0KCkuaXNFbXB0eSgpICkKLSAgICB7Ci0gICAgICAgIGQtPnJlcGxhY2VDb21iby0+ YWRkVG9IaXN0b3J5KCBkLT5yZXBsYWNlQ29tYm8tPmN1cnJlbnRUZXh0KCkgKTsKLSAgICAgICAg ZW1pdCByZXBsYWNlKCk7Ci0gICAgfQotfQotCi12b2lkIEtFZFJlcGxhY2U6OnNsb3RVc2VyMygg dm9pZCApCi17Ci0gIGlmKCAhZC0+c2VhcmNoQ29tYm8tPmN1cnJlbnRUZXh0KCkuaXNFbXB0eSgp ICkKLSAgewotICAgIGQtPnNlYXJjaENvbWJvLT5hZGRUb0hpc3RvcnkoIGQtPnNlYXJjaENvbWJv LT5jdXJyZW50VGV4dCgpICk7Ci0gICAgZW1pdCBmaW5kKCk7Ci0gIH0KLX0KLQotCi1RU3RyaW5n IEtFZFJlcGxhY2U6OmdldFRleHQoKQotewotICAgIHJldHVybiBkLT5zZWFyY2hDb21iby0+Y3Vy cmVudFRleHQoKTsKLX0KIAorICByZXBsYWNlX2RpYWxvZyA9IG5ldyBLRWRSZXBsYWNlKCB0aGlz LCAicmVwbGFjZV9kaWFsb2ciICwwLCpmaW5kbGlzdCwqcmVwbGFjZWxpc3QsdGhpcy0+aGFzU2Vs ZWN0ZWRUZXh0KCkpOworCXJlcGxhY2VfZGlhbG9nLT5zZXRUZXh0KGZpbmRsaXN0LT5sYXN0KCkp OworCXJlcGxhY2VfZGlhbG9nLT5zZXRSZXBsYWNlVGV4dChyZXBsYWNlbGlzdC0+bGFzdCgpKTsK KworCWlmICggcmVwbGFjZV9kaWFsb2ctPmV4ZWMoKSAhPSBRRGlhbG9nOjpBY2NlcHRlZCApIHJl dHVybjsKKwlpZiAoZmluZGxpc3QtPmNvbnRhaW5zKHJlcGxhY2VfZGlhbG9nLT5nZXRUZXh0KCkp PT0wKSBmaW5kbGlzdC0+YXBwZW5kKHJlcGxhY2VfZGlhbG9nLT5nZXRUZXh0KCkpOworCWlmIChy ZXBsYWNlbGlzdC0+Y29udGFpbnMocmVwbGFjZV9kaWFsb2ctPnJlcGxhY2VtZW50KCkpPT0wKSBy ZXBsYWNlbGlzdC0+YXBwZW5kKHJlcGxhY2VfZGlhbG9nLT5yZXBsYWNlbWVudCgpKTsKKworCUtF ZFJlcGxhY2VOZXh0IHJuIChyZXBsYWNlX2RpYWxvZy0+Z2V0VGV4dCgpLHJlcGxhY2VfZGlhbG9n LT5nZXRSZXBsYWNlVGV4dCgpLHJlcGxhY2VfZGlhbG9nLT5vcHRpb25zKCksdGhpcyk7CisJCisg IGNvbm5lY3QoJnJuLFNJR05BTChoaWdobGlnaHQoY29uc3QgUVN0cmluZyAmLCBpbnQsIGludCwg Y29uc3QgUVJlY3QgJiwgbG9uZykpLHRoaXMsU0xPVChoaWdobGlnaHQoY29uc3QgUVN0cmluZyAm LCBpbnQsIGludCwgY29uc3QgUVJlY3QgJiwgbG9uZykpKTsKKyAgY29ubmVjdCgmcm4sU0lHTkFM KHJlcGxhY2UoY29uc3QgUVN0cmluZyAmLCBpbnQsIGludCxpbnQsIGNvbnN0IFFSZWN0ICYsIGxv bmcpKSx0aGlzLFNMT1QoZG9yZXBsYWNlKGNvbnN0IFFTdHJpbmcgJiwgaW50LCBpbnQsaW50LCBj b25zdCBRUmVjdCAmLCBsb25nKSkgKTsKKwkKKwlRU3RyaW5nIF90ZXh0PXRoaXMtPnRleHQoKTsK KwlRUmVjdCByKDAsMCwwLDApOworCW9wdGlvbnM9cmVwbGFjZV9kaWFsb2ctPm9wdGlvbnMoKTsK KwkKKwlpbnQgcGFyYWYscGFyYXQsaWR4ZixpZHh0OworCWlmIChvcHRpb25zICYgS0VkRmluZDo6 U2VsZWN0ZWRUZXh0KSB7CisJCWdldFNlbGVjdGlvbigmcGFyYWYsJmlkeGYsJnBhcmF0LCZpZHh0 KTsKKwkJLyogYSBzbWFsbCBoYWNrIHRvIHNob3cgd2hlcmUgaXMgdGhlIHNlbGVjdGVkIHRleHQs IHRoaXMgaXMgdHJhbnNtaXR0ZWQgd2l0aCBubyBjaGFuZ2UgdG8gdGhlIGhpZ2hsaWdodCBmdW5j dGlvbiAqLworCQlyLnNldFRvcChwYXJhZik7CisJCXIuc2V0TGVmdChpZHhmKTsKKwkJci5zZXRS aWdodChpZHh0KTsKKwkJci5zZXRCb3R0b20ocGFyYXQpOworCQlfdGV4dD10aGlzLT5zZWxlY3Rl ZFRleHQoKTsKKwl9IGVsc2UgeworCQlpZiAob3B0aW9ucyAmIEtFZEZpbmQ6OkZyb21DdXJzb3Ip IHsKKwkJCWludCBjdXJyZW50cGFyYT0wOworCQkJZ2V0Q3Vyc29yUG9zaXRpb24gKCZjdXJyZW50 cGFyYSwmaWR4Zik7CisJCQkvKiBnZXQgZ2xvYmFsIGluZGV4ICovCisJCQlpbnQgaT0wOworCQkJ d2hpbGUgKGk8IGN1cnJlbnRwYXJhKSB7CisJCQkJCWlkeGYrPXBhcmFncmFwaExlbmd0aChpKysp KzE7CisJCQl9CisJCQlfdGV4dD10aGlzLT50ZXh0KCk7CisJCQlpZiAob3B0aW9ucyAmIEtFZEZp bmQ6OkZpbmRCYWNrd2FyZHMpIHsKKwkJCQlfdGV4dC50cnVuY2F0ZShpZHhmKTsKKwkJCQlyLnNl dFJpZ2h0KGlkeGYpOworCQkJfSBlbHNlIHsKKwkJCQlfdGV4dC5yZW1vdmUoMCxpZHhmKTsKKwkJ CQlyLnNldFJpZ2h0KGlkeGYpOworCQkJfQorCQl9CisJfQorLy8Ja2REZWJ1ZygyOTQpIDw8ICJ0 ZXh0OiAiIDw8IF90ZXh0IDw8IGVuZGw7CisJcm4ucmVwbGFjZShfdGV4dCxyKTsKKwkKIAotUVN0 cmluZyBLRWRSZXBsYWNlOjpnZXRSZXBsYWNlVGV4dCgpCi17Ci0gICAgcmV0dXJuIGQtPnJlcGxh Y2VDb21iby0+Y3VycmVudFRleHQoKTsKLX0KLQotCi12b2lkIEtFZFJlcGxhY2U6OnNldFRleHQo UVN0cmluZyBzdHJpbmcpCi17Ci0gIGQtPnNlYXJjaENvbWJvLT5zZXRFZGl0VGV4dChzdHJpbmcp OwotICBkLT5zZWFyY2hDb21iby0+bGluZUVkaXQoKS0+c2VsZWN0QWxsKCk7Ci19Ci0KLQotYm9v bCBLRWRSZXBsYWNlOjpjYXNlX3NlbnNpdGl2ZSgpCi17Ci0gIHJldHVybiBzZW5zaXRpdmUtPmlz Q2hlY2tlZCgpOwotfQotCi0KLWJvb2wgS0VkUmVwbGFjZTo6Z2V0X2RpcmVjdGlvbigpCi17Ci0g IHJldHVybiBkaXJlY3Rpb24tPmlzQ2hlY2tlZCgpOwotfQotCi1LSGlzdG9yeUNvbWJvICogS0Vk UmVwbGFjZTo6c2VhcmNoQ29tYm8oKSBjb25zdAotewotICAgIHJldHVybiBkLT5zZWFyY2hDb21i bzsKLX0KLQotS0hpc3RvcnlDb21ibyAqIEtFZFJlcGxhY2U6OnJlcGxhY2VDb21ibygpIGNvbnN0 Ci17Ci0gICAgcmV0dXJuIGQtPnJlcGxhY2VDb21ibzsKKwlkZWxldGUgcmVwbGFjZV9kaWFsb2c7 CisJcmVwbGFjZV9kaWFsb2c9MDsKIH0KIAogCkluZGV4OiBrZWRyZXBsYWNlLmNwcAo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09ClJDUyBmaWxlOiBrZWRyZXBsYWNlLmNwcApkaWZmIC1OIGtlZHJlcGxhY2UuY3BwCi0tLSAv ZGV2L251bGwJVHVlIE1heSAgNSAyMDozMjoyNyAxOTk4CisrKyBrZWRyZXBsYWNlLmNwcAlTYXQg Tm92IDE3IDIzOjQyOjE4IDIwMDEKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgICAgQ29weXJpZ2h0 IChDKSAyMDAxLCBTLlIuSGFxdWUgPHNyaGFxdWVAaWVlLm9yZz4uCisgICAgVGhpcyBmaWxlIGlz IHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNl IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAg ICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGli cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ug c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICAgQm9zdG9uLCBN QSAwMjExMS0xMzA3LCBVU0EuCisqLworCisjaW5jbHVkZSA8cWNoZWNrYm94Lmg+CisjaW5jbHVk ZSA8cWxhYmVsLmg+CisjaW5jbHVkZSA8cXJlZ2V4cC5oPgorI2luY2x1ZGUgPGthcHBsaWNhdGlv bi5oPgorI2luY2x1ZGUgPGtkZWJ1Zy5oPgorI2luY2x1ZGUgPGtjb21ib2JveC5oPgorI2luY2x1 ZGUgPGtsb2NhbGUuaD4KKyNpbmNsdWRlIDxrZWRyZXBsYWNlLmg+CisjaW5jbHVkZSA8a21lc3Nh Z2Vib3guaD4KKworS0VkUmVwbGFjZTo6S0VkUmVwbGFjZShRV2lkZ2V0ICpwYXJlbnQsIGNvbnN0 IGNoYXIgKm5hbWUsIGxvbmcgb3B0aW9ucywgY29uc3QgUVN0cmluZ0xpc3QgJmZpbmRTdHJpbmdz LCBjb25zdCBRU3RyaW5nTGlzdCAmcmVwbGFjZVN0cmluZ3MsIGJvb2wgaGFzU2VsZWN0aW9uKSA6 CisgICAgS0VkRmluZChwYXJlbnQsIG5hbWUsIHRydWUpCit7CisgICAgaW5pdCh0cnVlLCBmaW5k U3RyaW5ncywgaGFzU2VsZWN0aW9uKTsKKyAgICBzZXRPcHRpb25zKG9wdGlvbnMpOworICAgIHNl dFJlcGxhY2VtZW50SGlzdG9yeShyZXBsYWNlU3RyaW5ncyk7Cit9CisKK0tFZFJlcGxhY2U6On5L RWRSZXBsYWNlKCkKK3sKK30KKworbG9uZyBLRWRSZXBsYWNlOjpvcHRpb25zKCkgY29uc3QKK3sK KyAgICBsb25nIG9wdGlvbnMgPSAwOworCisgICAgb3B0aW9ucyA9IEtFZEZpbmQ6Om9wdGlvbnMo KTsKKyAgICBpZiAobV9wcm9tcHRPblJlcGxhY2UtPmlzQ2hlY2tlZCgpKQorICAgICAgICBvcHRp b25zIHw9IFByb21wdE9uUmVwbGFjZTsKKyAgICBpZiAobV9iYWNrUmVmLT5pc0NoZWNrZWQoKSkK KyAgICAgICAgb3B0aW9ucyB8PSBCYWNrUmVmZXJlbmNlOworICAgIHJldHVybiBvcHRpb25zOwor fQorCitRV2lkZ2V0ICpLRWRSZXBsYWNlOjpyZXBsYWNlRXh0ZW5zaW9uKCkKK3sKKyAgICByZXR1 cm4gbV9yZXBsYWNlRXh0ZW5zaW9uOworfQorCitRU3RyaW5nIEtFZFJlcGxhY2U6OnJlcGxhY2Vt ZW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9yZXBsYWNlLT5jdXJyZW50VGV4dCgpOworfQor CitRU3RyaW5nIEtFZFJlcGxhY2U6OmdldFJlcGxhY2VUZXh0KCkgY29uc3QKK3sKKwlyZXR1cm4g bV9yZXBsYWNlLT5jdXJyZW50VGV4dCgpOworfQorCit2b2lkIEtFZFJlcGxhY2U6OnNldFJlcGxh Y2VUZXh0KFFTdHJpbmcgc3RyaW5nKQoreworCW1fcmVwbGFjZS0+c2V0RWRpdFRleHQoc3RyaW5n KTsKK30KKworUVN0cmluZ0xpc3QgS0VkUmVwbGFjZTo6cmVwbGFjZW1lbnRIaXN0b3J5KCkgY29u c3QKK3sKKyAgICByZXR1cm4gbV9maW5kLT5oaXN0b3J5SXRlbXMoKTsKK30KKwordm9pZCBLRWRS ZXBsYWNlOjpzZXRPcHRpb25zKGxvbmcgb3B0aW9ucykKK3sKKyAgICBLRWRGaW5kOjpzZXRPcHRp b25zKG9wdGlvbnMpOworICAgIG1fcHJvbXB0T25SZXBsYWNlLT5zZXRDaGVja2VkKG9wdGlvbnMg JiBQcm9tcHRPblJlcGxhY2UpOworICAgIG1fYmFja1JlZi0+c2V0Q2hlY2tlZChvcHRpb25zICYg QmFja1JlZmVyZW5jZSk7Cit9CisKK3ZvaWQgS0VkUmVwbGFjZTo6c2V0UmVwbGFjZW1lbnRIaXN0 b3J5KGNvbnN0IFFTdHJpbmdMaXN0ICZzdHJpbmdzKQoreworICAgIGlmIChzdHJpbmdzLmNvdW50 KCkgPiAwKQorICAgICAgICBtX3JlcGxhY2UtPnNldEhpc3RvcnlJdGVtcyhzdHJpbmdzLCB0cnVl KTsKKyAgICBlbHNlCisgICAgICAgIG1fcmVwbGFjZS0+Y2xlYXJIaXN0b3J5KCk7Cit9CisKK3Zv aWQgS0VkUmVwbGFjZTo6c2xvdE9rKCkKK3sKKyAgICBLRWRGaW5kOjpzbG90T2soKTsKKyAgICBt X3JlcGxhY2UtPmFkZFRvSGlzdG9yeShyZXBsYWNlbWVudCgpKTsKK30KKworLy8gQ3JlYXRlIHRo ZSBkaWFsb2cuCitLRWRSZXBsYWNlTmV4dDo6S0VkUmVwbGFjZU5leHQoY29uc3QgUVN0cmluZyAm cGF0dGVybiwgY29uc3QgUVN0cmluZyAmcmVwbGFjZW1lbnQsIGxvbmcgb3B0aW9ucywgUVdpZGdl dCAqcGFyZW50KSA6CisgICAgS0RpYWxvZ0Jhc2UocGFyZW50LCBfX0ZJTEVfXywgZmFsc2UsICAv LyBub24tbW9kYWwhCisgICAgICAgIGkxOG4oIlJlcGxhY2UiKSwKKyAgICAgICAgVXNlcjMgfCBV c2VyMiB8IFVzZXIxIHwgQ2xvc2UsCisgICAgICAgIFVzZXIzLAorICAgICAgICBmYWxzZSwKKyAg ICAgICAgaTE4bigiJkFsbCIpLCBpMThuKCImU2tpcCIpLCBpMThuKCImWWVzIikpCit7CisgICAg c2V0TWFpbldpZGdldCggbmV3IFFMYWJlbCggaTE4bigiUmVwbGFjZSAnJTEnIHdpdGggJyUyJz8i KS5hcmcocGF0dGVybikuYXJnKHJlcGxhY2VtZW50KSwgdGhpcyApICk7CisgICAgbV9jYW5jZWxs ZWQgPSBmYWxzZTsKKyAgICBtX29wdGlvbnMgPSBvcHRpb25zOworICAgIG1fcGFyZW50ID0gcGFy ZW50OworICAgIG1fcmVwbGFjZW1lbnRzID0gMDsKKyAgICBpZiAobV9vcHRpb25zICYgS0VkUmVw bGFjZTo6UmVndWxhckV4cHJlc3Npb24pCisgICAgICAgIG1fcmVnRXhwID0gbmV3IFFSZWdFeHAo cGF0dGVybiwgbV9vcHRpb25zICYgS0VkUmVwbGFjZTo6Q2FzZVNlbnNpdGl2ZSk7CisgICAgZWxz ZQorICAgICAgICBtX3BhdHRlcm4gPSBwYXR0ZXJuOworICAgIG1fcmVwbGFjZW1lbnQgPSByZXBs YWNlbWVudDsKKyAgICByZXNpemUobWluaW11bVNpemUoKSk7Cit9CisKK0tFZFJlcGxhY2VOZXh0 Ojp+S0VkUmVwbGFjZU5leHQoKQoreworICAgIGlmICghbV9yZXBsYWNlbWVudHMgJiYgIW1fY2Fu Y2VsbGVkKQorICAgICAgICBLTWVzc2FnZUJveDo6aW5mb3JtYXRpb24obV9wYXJlbnQsIGkxOG4o Ik5vIHRleHQgd2FzIHJlcGxhY2VkLiIpKTsKK30KKwordm9pZCBLRWRSZXBsYWNlTmV4dDo6c2xv dENsb3NlKCkKK3sKKyAgICBtX2NhbmNlbGxlZCA9IHRydWU7CisgICAga2FwcC0+ZXhpdF9sb29w KCk7Cit9CisKK3ZvaWQgS0VkUmVwbGFjZU5leHQ6OmFib3J0KCkKK3sKKyAgICBzbG90Q2xvc2Uo KTsKK30KKworYm9vbCBLRWRSZXBsYWNlTmV4dDo6cmVwbGFjZShRU3RyaW5nICZ0ZXh0LCBjb25z dCBRUmVjdCAmZXhwb3NlKQoreworICAgIGlmIChtX29wdGlvbnMgJiBLRWRGaW5kOjpGaW5kQmFj a3dhcmRzKQorICAgIHsKKyAgICAgICAgbV9pbmRleCA9IHRleHQubGVuZ3RoKCk7CisgICAgfQor ICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1faW5kZXggPSAwOworICAgIH0KKyAgICBtX3RleHQg PSB0ZXh0OworICAgIG1fZXhwb3NlID0gZXhwb3NlOworICAgIGRvCisgICAgeworICAgICAgICAv LyBGaW5kIHRoZSBuZXh0IG1hdGNoLgorICAgICAgICBpZiAobV9vcHRpb25zICYgS0VkUmVwbGFj ZTo6UmVndWxhckV4cHJlc3Npb24pCisgICAgICAgICAgICBtX2luZGV4ID0gS0VkRmluZE5leHQ6 OmZpbmQobV90ZXh0LCAqbV9yZWdFeHAsIG1faW5kZXgsIG1fb3B0aW9ucywgJm1fbWF0Y2hlZExl bmd0aCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1faW5kZXggPSBLRWRGaW5kTmV4dDo6 ZmluZChtX3RleHQsIG1fcGF0dGVybiwgbV9pbmRleCwgbV9vcHRpb25zLCAmbV9tYXRjaGVkTGVu Z3RoKTsKKyAgICAgICAgaWYgKG1faW5kZXggIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAg IGlmIChtX29wdGlvbnMgJiBLRWRSZXBsYWNlOjpQcm9tcHRPblJlcGxhY2UpCisgICAgICAgICAg ICB7CisgICAgICAgICAgICAgICAgLy8gVGVsbCB0aGUgd29ybGQgYWJvdXQgdGhlIG1hdGNoIHdl IGZvdW5kLCBpbiBjYXNlIHNvbWVvbmUgd2FudHMgdG8KKyAgICAgICAgICAgICAgICAvLyBoaWdo bGlnaHQgaXQuCisgICAgICAgICAgICAgICAgZW1pdCBoaWdobGlnaHQobV90ZXh0LCBtX2luZGV4 LCBtX21hdGNoZWRMZW5ndGgsIG1fZXhwb3NlLCBtX29wdGlvbnMpOworICAgICAgICAgICAgICAg IHNob3coKTsKKyAgICAgICAgICAgICAgICBrYXBwLT5lbnRlcl9sb29wKCk7CisgICAgICAgICAg ICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG9S ZXBsYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKCht X2luZGV4ICE9IC0xKSAmJiAhbV9jYW5jZWxsZWQpOworICAgIHRleHQgPSBtX3RleHQ7CisKKyAg ICAvLyBTaG91bGQgdGhlIHVzZXIgY29udGludWU/CisgICAgcmV0dXJuICFtX2NhbmNlbGxlZDsK K30KKworaW50IEtFZFJlcGxhY2VOZXh0OjpyZXBsYWNlKFFTdHJpbmcgJnRleHQsIGNvbnN0IFFT dHJpbmcgJnBhdHRlcm4sIGNvbnN0IFFTdHJpbmcgJnJlcGxhY2VtZW50LCBpbnQgaW5kZXgsIGxv bmcgb3B0aW9ucywgaW50ICpyZXBsYWNlZExlbmd0aCkKK3sKKyAgICBpbnQgbWF0Y2hlZExlbmd0 aDsKKworICAgIGluZGV4ID0gS0VkRmluZE5leHQ6OmZpbmQodGV4dCwgcGF0dGVybiwgaW5kZXgs IG9wdGlvbnMsICZtYXRjaGVkTGVuZ3RoKTsKKyAgICBpZiAoaW5kZXggIT0gLTEpCisgICAgewor ICAgICAgICAqcmVwbGFjZWRMZW5ndGggPSByZXBsYWNlKHRleHQsIHJlcGxhY2VtZW50LCBpbmRl eCwgbWF0Y2hlZExlbmd0aCk7CisgICAgICAgIGlmIChvcHRpb25zICYgS0VkUmVwbGFjZTo6Rmlu ZEJhY2t3YXJkcykKKyAgICAgICAgICAgIGluZGV4LS07CisgICAgICAgIGVsc2UKKyAgICAgICAg ICAgIGluZGV4ICs9ICpyZXBsYWNlZExlbmd0aDsKKyAgICB9CisgICAgcmV0dXJuIGluZGV4Owor fQorCitpbnQgS0VkUmVwbGFjZU5leHQ6OnJlcGxhY2UoUVN0cmluZyAmdGV4dCwgY29uc3QgUVJl Z0V4cCAmcGF0dGVybiwgY29uc3QgUVN0cmluZyAmcmVwbGFjZW1lbnQsIGludCBpbmRleCwgbG9u ZyBvcHRpb25zLCBpbnQgKnJlcGxhY2VkTGVuZ3RoKQoreworICAgIGludCBtYXRjaGVkTGVuZ3Ro OworCisgICAgaW5kZXggPSBLRWRGaW5kTmV4dDo6ZmluZCh0ZXh0LCBwYXR0ZXJuLCBpbmRleCwg b3B0aW9ucywgJm1hdGNoZWRMZW5ndGgpOworICAgIGlmIChpbmRleCAhPSAtMSkKKyAgICB7Cisg ICAgICAgICpyZXBsYWNlZExlbmd0aCA9IHJlcGxhY2UodGV4dCwgcmVwbGFjZW1lbnQsIGluZGV4 LCBtYXRjaGVkTGVuZ3RoKTsKKyAgICAgICAgaWYgKG9wdGlvbnMgJiBLRWRSZXBsYWNlOjpGaW5k QmFja3dhcmRzKQorICAgICAgICAgICAgaW5kZXgtLTsKKyAgICAgICAgZWxzZQorICAgICAgICAg ICAgaW5kZXggKz0gKnJlcGxhY2VkTGVuZ3RoOworICAgIH0KKyAgICByZXR1cm4gaW5kZXg7Cit9 CisKK2ludCBLRWRSZXBsYWNlTmV4dDo6cmVwbGFjZShRU3RyaW5nICZ0ZXh0LCBjb25zdCBRU3Ry aW5nICZyZXBsYWNlbWVudCwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKQoreworICAgIC8vIFRCRDog aW1wbGVtZW50IGJhY2tyZWZlcmVuY2VzLgorICAgIHRleHQucmVwbGFjZShpbmRleCwgbGVuZ3Ro LCByZXBsYWNlbWVudCk7CisgICAgcmV0dXJuIHJlcGxhY2VtZW50Lmxlbmd0aCgpOworfQorCisv LyBBbGwuCit2b2lkIEtFZFJlcGxhY2VOZXh0OjpzbG90VXNlcjEoKQoreworICAgIGludCByZXBs YWNlZExlbmd0aDsKKworICAgIHJlcGxhY2VkTGVuZ3RoID0gS0VkUmVwbGFjZU5leHQ6OnJlcGxh Y2UobV90ZXh0LCBtX3JlcGxhY2VtZW50LCBtX2luZGV4LCBtX21hdGNoZWRMZW5ndGgpOworCisg ICAgLy8gVGVsbCB0aGUgd29ybGQgYWJvdXQgdGhlIHJlcGxhY2VtZW50IHdlIG1hZGUsIGluIGNh c2Ugc29tZW9uZSB3YW50cyB0bworICAgIC8vIGhpZ2hsaWdodCBpdC4KKyAgICBlbWl0IHJlcGxh Y2UobV90ZXh0LCBtX2luZGV4LCByZXBsYWNlZExlbmd0aCxtX21hdGNoZWRMZW5ndGggLCBtX2V4 cG9zZSwgbV9vcHRpb25zKTsKKyAgICBtX3JlcGxhY2VtZW50cysrOworICAgIGlmIChtX29wdGlv bnMgJiBLRWRSZXBsYWNlOjpGaW5kQmFja3dhcmRzKQorICAgICAgICBtX2luZGV4LS07CisgICAg ZWxzZQorICAgICAgICBtX2luZGV4ICs9IHJlcGxhY2VkTGVuZ3RoOworICAgIG1fb3B0aW9ucyAm PSB+S0VkUmVwbGFjZTo6UHJvbXB0T25SZXBsYWNlOworICAgIGthcHAtPmV4aXRfbG9vcCgpOwor fQorCisvLyBTa2lwLgordm9pZCBLRWRSZXBsYWNlTmV4dDo6c2xvdFVzZXIyKCkKK3sKKyAgICBp ZiAobV9vcHRpb25zICYgS0VkRmluZDo6RmluZEJhY2t3YXJkcykgbV9pbmRleC0tOworCWVsc2Ug IG1faW5kZXgrKzsKKyAgICBrYXBwLT5leGl0X2xvb3AoKTsKK30KKworLy8gWWVzLgordm9pZCBL RWRSZXBsYWNlTmV4dDo6c2xvdFVzZXIzKCkKK3sKKyAgICBkb1JlcGxhY2UoKTsKKyAgICBrYXBw LT5leGl0X2xvb3AoKTsKK30KKwordm9pZCBLRWRSZXBsYWNlTmV4dDo6ZG9SZXBsYWNlKCkKK3sK KyAgICBpbnQgcmVwbGFjZWRMZW5ndGg7CisKKyAgICByZXBsYWNlZExlbmd0aCA9IEtFZFJlcGxh Y2VOZXh0OjpyZXBsYWNlKG1fdGV4dCwgbV9yZXBsYWNlbWVudCwgbV9pbmRleCwgbV9tYXRjaGVk TGVuZ3RoKTsKKworICAgIC8vIFRlbGwgdGhlIHdvcmxkIGFib3V0IHRoZSByZXBsYWNlbWVudCB3 ZSBtYWRlLCBpbiBjYXNlIHNvbWVvbmUgd2FudHMgdG8KKyAgICAvLyBoaWdobGlnaHQgaXQuCisg ICAgZW1pdCByZXBsYWNlKG1fdGV4dCwgbV9pbmRleCwgcmVwbGFjZWRMZW5ndGgsbV9tYXRjaGVk TGVuZ3RoLCBtX2V4cG9zZSwgbV9vcHRpb25zKTsKKyAgICBtX3JlcGxhY2VtZW50cysrOworICAg IGlmIChtX29wdGlvbnMgJiBLRWRSZXBsYWNlOjpGaW5kQmFja3dhcmRzKQorICAgICAgICBtX2lu ZGV4LS07CisgICAgZWxzZQorICAgICAgICBtX2luZGV4ICs9IHJlcGxhY2VkTGVuZ3RoOworfQor CisjaW5jbHVkZSAia2VkcmVwbGFjZS5tb2MiCkluZGV4OiBrZWRyZXBsYWNlLmgKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQpSQ1MgZmlsZToga2VkcmVwbGFjZS5oCmRpZmYgLU4ga2VkcmVwbGFjZS5oCi0tLSAvZGV2L251 bGwJVHVlIE1heSAgNSAyMDozMjoyNyAxOTk4CisrKyBrZWRyZXBsYWNlLmgJU2F0IE5vdiAxNyAy Mzo0MjoyMSAyMDAxCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICAgIENvcHlyaWdodCAoQykgMjAw MSwgUy5SLkhhcXVlIDxzcmhhcXVlQGllZS5vcmc+LgorICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9m IHRoZSBLREUgcHJvamVjdAorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJs aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lv biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u LgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M SUIuICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg SW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgIEJvc3RvbiwgTUEgMDIxMTEt MTMwNywgVVNBLgorKi8KKworI2lmbmRlZiBLRURSRVBMQUNFX0gKKyNkZWZpbmUgS0VEUkVQTEFD RV9ICisKKyNpbmNsdWRlIDxrZWRmaW5kLmg+CisKK2NsYXNzIEtIaXN0b3J5Q29tYm87CitjbGFz cyBRQ2hlY2tCb3g7CitjbGFzcyBRR3JvdXBCb3g7CitjbGFzcyBRTGFiZWw7CitjbGFzcyBRUG9w dXBNZW51OworY2xhc3MgUVB1c2hCdXR0b247CitjbGFzcyBRUmVjdDsKKworLyoqCisgKiBAc2hv cnQgQSBnZW5lcmljICJyZXBsYWNlIiB3aWRnZXQuCisgKgorICogQGF1dGhvciBTLlIuSGFxdWUg PHNyaGFxdWVAaWVlLm9yZz4KKyAqCisgKiBAc2VjdCBEZXRhaWwKKyAqCisgKiBUaGlzIHdpZGdl dCBpbmhlcml0cyBmcm9tIEByZWYgS0VkRmluZCBhbmQgaW1wbGVtZW50cworICogdGhlIGZvbGxv d2luZyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdGllczogIGEgcmVwbGFjZW1lbnQgc3RyaW5nCisg KiBvYmplY3QgYW5kIGFuIGFyZWEgZm9yIGEgdXNlci1kZWZpbmVkIHdpZGdldCB0byBleHRlbmQg dGhlIGRpYWxvZy4KKyAqCisgKiBAc2VjdCBFeGFtcGxlCisgKgorICogVG8gdXNlIHRoZSBiYXNp YyByZXBsYWNlIGRpYWxvZzoKKyAqCisgKiA8cHJlPgorICogPC9wcmU+CisgKgorICogVG8gdXNl IHlvdXIgb3duIGV4dGVuc2lvbnM6CisgKgorICogPHByZT4KKyAqIDwvcHJlPgorICovCisKK2Ns YXNzIEtFZFJlcGxhY2U6CisgICAgcHVibGljIEtFZEZpbmQKK3sKKyAgICBRX09CSkVDVAorCitw dWJsaWM6CisKKyAgICAvLyBPcHRpb25zLgorCisgICAgdHlwZWRlZiBlbnVtCisgICAgeworICAg ICAgICAvLyBTaG91bGQgdGhlIHVzZXIgYmUgcHJvbXB0ZWQgYmVmb3JlIHRoZSByZXBsYWNlIG9w ZXJhdGlvbj8KKyAgICAgICAgUHJvbXB0T25SZXBsYWNlID0gMjU2LAorICAgICAgICBCYWNrUmVm ZXJlbmNlID0gNTEyCisgICAgfSBPcHRpb25zOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0 IGEgcmVwbGFjZSBkaWFsb2cucmVhZC1vbmx5IG9yIHJhdGhlciBzZWxlY3Qtb25seSBjb21ibyBi b3ggd2l0aCBhCisgICAgICogcGFyZW50IG9iamVjdCBhbmQgYSBuYW1lLgorICAgICAqCisgICAg ICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9iamVjdCBvZiB0aGlzIHdpZGdldAorICAgICAq IEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgd2lkZ2V0CisgICAgICogQHBhcmFtIG9wdGlv bnMgQSBiaXRmaWVsZCBvZiB0aGUgQHJlZiBPcHRpb25zIHRvIGJlIGVuYWJsZWQuCisgICAgICog QHBhcmFtIGhhc1NlbGVjdGlvbiBXaGV0aGVyIGEgc2VsZWN0aW9uIGV4aXN0cworICAgICAqLwor ICAgIEtFZFJlcGxhY2UoIFFXaWRnZXQgKnBhcmVudCA9IDAsIGNvbnN0IGNoYXIgKm5hbWUgPSAw LCBsb25nIG9wdGlvbnMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVN0cmluZ0xp c3QgJmZpbmRTdHJpbmdzID0gUVN0cmluZ0xpc3QoKSwgY29uc3QgUVN0cmluZ0xpc3QgJnJlcGxh Y2VTdHJpbmdzID0gUVN0cmluZ0xpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFz U2VsZWN0aW9uID0gdHJ1ZSApOworCisgICAgLyoqCisgICAgICogRGVzdHJ1Y3Rvci4KKyAgICAg Ki8KKyAgICB2aXJ0dWFsIH5LRWRSZXBsYWNlKCk7CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRl IHRoZSBsaXN0IG9mIEBwIHN0cmluZ3MgdG8gYmUgZGlzcGxheWVkIGFzIHRoZSBoaXN0b3J5Cisg ICAgICogb2YgcmVwbGFjZW1lbnQgc3RyaW5ncy4gQHAgc3RyaW5ncyBtaWdodCBnZXQgdHJ1bmNh dGVkIGlmIGl0IGlzCisgICAgICogdG9vIGxvbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGlz dG9yeSBUaGUgcmVwbGFjZW1lbnQgaGlzdG9yeS4KKyAgICAgKiBAc2VlICNyZXBsYWNlbWVudEhp c3RvcnkKKyAgICAgKi8KKyAgICB2b2lkIHNldFJlcGxhY2VtZW50SGlzdG9yeSggY29uc3QgUVN0 cmluZ0xpc3QgJnN0cmluZ3MgKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qg b2YgaGlzdG9yeSBpdGVtcy4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFJlcGxhY2VtZW50SGlz dG9yeQorICAgICAqLworICAgIFFTdHJpbmdMaXN0IHJlcGxhY2VtZW50SGlzdG9yeSgpIGNvbnN0 OworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvcHRpb25zIHdoaWNoIGFyZSBlbmFibGVkLgor ICAgICAqCisgICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHNldHRpbmcgb2YgdGhlIEByZWYgT3B0 aW9ucy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE9wdGlvbnMoIGxvbmcgb3B0aW9ucyApOworCisg ICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIG9wdGlvbnMuIERpc2FibGVk IG9wdGlvbnMgbWF5IGJlIHJldHVybmVkIGluCisgICAgICogYW4gaW5kZXRlcm1pbmF0ZSBzdGF0 ZS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldE9wdGlvbnMKKyAgICAgKi8KKyAgICBsb25nIG9w dGlvbnMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlcGxhY2VtZW50 IHN0cmluZy4KKyAgICAgKi8KKyAgICBRU3RyaW5nIHJlcGxhY2VtZW50KCkgY29uc3Q7CisKKwkv KgorCSAqIFNldHMgdGhlIHJlcGxhY2UgdGV4dAorCSAqLworCXZvaWQgc2V0UmVwbGFjZVRleHQo UVN0cmluZyBzdHJpbmcpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBlbXB0eSB3aWRn ZXQgd2hpY2ggdGhlIHVzZXIgbWF5IGZpbGwgd2l0aCBhZGRpdGlvbmFsIFVJCisgICAgICogZWxl bWVudHMgYXMgcmVxdWlyZWQuIFRoZSB3aWRnZXQgb2NjdXBpZXMgdGhlIHdpZHRoIG9mIHRoZSBk aWFsb2csCisgICAgICogYW5kIGlzIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgdGhlIHJlZ3VsYXIg ZXhwcmVzc2lvbiBzdXBwb3J0IHdpZGdldHMKKyAgICAgKiBmb3IgdGhlIHJlcGxhY2VtZW50IHN0 cmluZy4KKyAgICAgKi8KKyAgICBRV2lkZ2V0ICpyZXBsYWNlRXh0ZW5zaW9uKCk7CisKKwkvKioK KwkgKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMKKwkgKi8KKworCVFTdHJpbmcg Z2V0UmVwbGFjZVRleHQoKSBjb25zdDsKKworCitwcm90ZWN0ZWQgc2xvdHM6CisKKyAgICB2b2lk IHNsb3RPaygpOworCitwcml2YXRlOgorCisgICAgLy8gQmluYXJ5IGNvbXBhdGlibGUgZXh0ZW5z aWJpbGl0eS4KKyAgICBjbGFzcyBLRWRSZXBsYWNlUHJpdmF0ZTsKKyAgICBLRWRSZXBsYWNlUHJp dmF0ZSAqZDsKK307CisKKy8qKgorICogQHNob3J0IEEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBv ZiB0aGUgInJlcGxhY2UiIGZ1bmN0aW9uLgorICoKKyAqIEBhdXRob3IgUy5SLkhhcXVlIDxzcmhh cXVlQGllZS5vcmc+CisgKgorICogQHNlY3QgRGV0YWlsCisgKgorICogVGhpcyBjbGFzcyBpbmNs dWRlcyBwcm9tcHQgaGFuZGxpbmcgZXRjLiBBbHNvIHByb3ZpZGVzIHNvbWUKKyAqIHN0YXRpYyBm dW5jdGlvbnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGN1c3RvbSBiZWhhdmlvdXIKKyAq IGluc3RlYWQgb2YgdXNpbmcgdGhlIGNsYXNzIGRpcmVjdGx5LgorICoKKyAqIEBzZWN0IEV4YW1w bGUKKyAqCisgKiBUbyB1c2UgdGhlIGNsYXNzIHRvIGltcGxlbWVudCBhIGNvbXBsZXRlIHJlcGxh Y2UgZmVhdHVyZToKKyAqCisgKiA8cHJlPgorICoKKyAqICAvLyBUaGlzIGNyZWF0ZXMgYSByZXBs YWNlLW9uLXByb21wdCBkaWFsb2cgaWYgbmVlZGVkLgorICogIGRpYWxvZyA9IG5ldyBLRWRSZXBs YWNlTmV4dChmaW5kLCByZXBsYWNlLCBvcHRpb25zKTsKKyAqCisgKiAgLy8gQ29ubmVjdCBzaWdu YWxzIHRvIGNvZGUgd2hpY2ggaGFuZGxlcyBoaWdobGlnaHRpbmcKKyAqICAvLyBvZiBmb3VuZCB0 ZXh0LCBhbmQgb24tdGhlLWZseSByZXBsYWNlbWVudC4KKyAqICBRT2JqZWN0Ojpjb25uZWN0KAor ICogICAgICBkaWFsb2csIFNJR05BTCggaGlnaGxpZ2h0KCBjb25zdCBRU3RyaW5nICYsIGludCwg aW50LCBjb25zdCBRUmVjdCAmICkgKSwKKyAqICAgICAgdGhpcywgU0xPVCggaGlnaGxpZ2h0KCBj b25zdCBRU3RyaW5nICYsIGludCwgaW50LCBjb25zdCBRUmVjdCAmICkgKSApOworICogIFFPYmpl Y3Q6OmNvbm5lY3QoCisgKiAgICAgIGRpYWxvZywgU0lHTkFMKCByZXBsYWNlKCBjb25zdCBRU3Ry aW5nICYsIGludCwgaW50LCBjb25zdCBRUmVjdCAmICkgKSwKKyAqICAgICAgdGhpcywgU0xPVCgg cmVwbGFjZSggY29uc3QgUVN0cmluZyAmLCBpbnQsIGludCwgY29uc3QgUVJlY3QgJiApICkgKTsK KyAqCisgKiAgZm9yICh0ZXh0IGNob3NlbiBieSBvcHRpb24gU2VsZWN0ZWRUZXh0IGFuZCBpbiBh IGRpcmVjdGlvbiBzZXQgYnkgRmluZEJhY2t3YXJkcykKKyAqICB7CisgKiAgICAgIGRpYWxvZy0+ cmVwbGFjZSgpCisgKiAgfQorICogIGRlbGV0ZSBkaWFsb2c7CisgKgorICogPC9wcmU+CisgKi8K KworY2xhc3MgS0VkUmVwbGFjZU5leHQgOgorICAgIHB1YmxpYyBLRGlhbG9nQmFzZQoreworICAg IFFfT0JKRUNUCisKK3B1YmxpYzoKKworICAgIC8qKiBXaWxsIGNyZWF0ZSBhIHByb21wdCBkaWFs b2cgYW5kIHVzZSBpdCBhcyBuZWVkZWQuICovCisgICAgS0VkUmVwbGFjZU5leHQoY29uc3QgUVN0 cmluZyAmcGF0dGVybiwgY29uc3QgUVN0cmluZyAmcmVwbGFjZW1lbnQsIGxvbmcgb3B0aW9ucywg UVdpZGdldCAqcGFyZW50ID0gMCk7CisgICAgfktFZFJlcGxhY2VOZXh0KCk7CisKKyAgICAvKioK KyAgICAgKiBXYWxrIHRoZSB0ZXh0IGZyYWdtZW50IChlLmcuIGt3cml0ZSBsaW5lLCBrc3ByZWFk IGNlbGwpIGxvb2tpbmcgZm9yIG1hdGNoZXMuCisgICAgICogRm9yIGVhY2ggbWF0Y2gsIGlmIHBy b21wdC1vbi1yZXBsYWNlIGlzIHNwZWNpZmllZCwgZW1pdHMgdGhlIGV4cG9zZSgpIHNpZ25hbAor ICAgICAqIGFuZCBkaXNwbGF5cyB0aGUgcHJvbXB0LWZvci1yZXBsYWNlIGRpYWxvZyBiZWZvcmUg ZG9pbmcgdGhlIHJlcGxhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBm cmFnbWVudCB0byBtb2RpZnkuCisgICAgICogQHBhcmFtIGV4cG9zZU9uUmVwbGFjZSBUaGUgcmVn aW9uIHRvIGV4cG9zZQorICAgICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHVzZXIgZWxlY3RlZCB0 byBkaXNjb250aW51ZSB0aGUgcmVwbGFjZS4KKyAgICAgKi8KKyAgICBib29sIHJlcGxhY2UoUVN0 cmluZyAmdGV4dCwgY29uc3QgUVJlY3QgJmV4cG9zZSk7CisKKyAgICAvKioKKyAgICAgKiBTZWFy Y2ggdGhlIGdpdmVuIHN0cmluZywgYW5kIHJldHVybnMgd2hldGhlciBhIG1hdGNoIHdhcyBmb3Vu ZC4gSWYgb25lIGlzLAorICAgICAqIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgbGVuZ3RoIGlzIGFs c28gcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBBIHBlcmZvcm1hbmNlIG9wdGltaXNlZCB2ZXJz aW9uIG9mIHRoZSBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgdXNlCisgICAgICogd2l0aCByZWd1 bGFyIGV4cHJlc3Npb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgVGhlIHN0cmluZyB0 byBzZWFyY2guCisgICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gbG9vayBmb3Iu CisgICAgICogQHBhcmFtIGluZGV4IFRoZSBzdGFydGluZyBpbmRleCBpbnRvIHRoZSBzdHJpbmcu CisgICAgICogQHBhcmFtIG9wdGlvbnMuIFRoZSBvcHRpb25zIHRvIHVzZS4KKyAgICAgKiBAcmV0 dXJuIFRoZSBpbmRleCBhdCB3aGljaCBhIG1hdGNoIHdhcyBmb3VuZCwgb3IgLTEgaWYgbm8gbWF0 Y2ggd2FzIGZvdW5kLgorICAgICAqLworICAgIHN0YXRpYyBpbnQgcmVwbGFjZSggUVN0cmluZyAm dGV4dCwgY29uc3QgUVN0cmluZyAmcGF0dGVybiwgY29uc3QgUVN0cmluZyAmcmVwbGFjZW1lbnQs IGludCBpbmRleCwgbG9uZyBvcHRpb25zLCBpbnQgKnJlcGxhY2VkTGVuZ3RoICk7CisgICAgc3Rh dGljIGludCByZXBsYWNlKCBRU3RyaW5nICZ0ZXh0LCBjb25zdCBRUmVnRXhwICZwYXR0ZXJuLCBj b25zdCBRU3RyaW5nICZyZXBsYWNlbWVudCwgaW50IGluZGV4LCBsb25nIG9wdGlvbnMsIGludCAq cmVwbGFjZWRMZW5ndGggKTsKKworICAgIC8qKgorICAgICAqIEFib3J0IHRoZSBjdXJyZW50IGZp bmQvcmVwbGFjZSBwcm9jZXNzLiBDYWxsIHRoaXMgd2hlbiB0aGUgcGFyZW50IHdpZGdldAorICAg ICAqIGlzIGdldHRpbmcgZGVzdHJveWVkLgorICAgICAqLworICAgIHZvaWQgYWJvcnQoKTsKKwor c2lnbmFsczoKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gdGhpcyBzbG90IHRvIGltcGxl bWVudCBoaWdobGlnaHRpbmcgb2YgZm91bmQgdGV4dCBkdXJpbmcgdGhlIHJlcGxhY2UKKyAgICAg KiBvcGVyYXRpb24uCisgICAgICovCisgICAgdm9pZCBoaWdobGlnaHQoY29uc3QgUVN0cmluZyAm dGV4dCwgaW50IG1hdGNoaW5nSW5kZXgsIGludCBtYXRjaGVkTGVuZ3RoLCBjb25zdCBRUmVjdCAm ZXhwb3NlLCBsb25nIG9wdGlvbnMpOworCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byB0aGlz IHNsb3QgdG8gaW1wbGVtZW50IHVwZGF0aW5nIG9mIHJlcGxhY2VkIHRleHQgZHVyaW5nIHRoZSBy ZXBsYWNlCisgICAgICogb3BlcmF0aW9uLgorICAgICAqLworICAgIHZvaWQgcmVwbGFjZShjb25z dCBRU3RyaW5nICZ0ZXh0LCBpbnQgcmVwbGFjZW1lbnRJbmRleCwgaW50IHJlcGxhY2VkTGVuZ3Ro LGludCBtYXRjaGVkTGVuZ3RoLCBjb25zdCBRUmVjdCAmZXhwb3NlLCBsb25nIG9wdGlvbnMpOwor Citwcml2YXRlOgorICAgIHZvaWQgZG9SZXBsYWNlKCk7CisKKyAgICBRU3RyaW5nIG1fcGF0dGVy bjsKKyAgICBRUmVnRXhwICptX3JlZ0V4cDsKKyAgICBRU3RyaW5nIG1fcmVwbGFjZW1lbnQ7Cisg ICAgbG9uZyBtX29wdGlvbnM7CisgICAgUVdpZGdldCAqbV9wYXJlbnQ7CisgICAgdW5zaWduZWQg bV9yZXBsYWNlbWVudHM7CisgICAgUVN0cmluZyBtX3RleHQ7CisgICAgaW50IG1faW5kZXg7Cisg ICAgUVJlY3QgbV9leHBvc2U7CisgICAgaW50IG1fbWF0Y2hlZExlbmd0aDsKKyAgICBib29sIG1f Y2FuY2VsbGVkOworCisgICAgc3RhdGljIGludCByZXBsYWNlKCBRU3RyaW5nICZ0ZXh0LCBjb25z dCBRU3RyaW5nICZyZXBsYWNlbWVudCwgaW50IGluZGV4LCBpbnQgbGVuZ3RoICk7CisKKyAgICAv LyBCaW5hcnkgY29tcGF0aWJsZSBleHRlbnNpYmlsaXR5LgorICAgIGNsYXNzIEtFZFJlcGxhY2VO ZXh0UHJpdmF0ZTsKKyAgICBLRWRSZXBsYWNlTmV4dFByaXZhdGUgKmQ7CisKK3ByaXZhdGUgc2xv dHM6CisKKyAgICB2b2lkIHNsb3RVc2VyMSgpOyAgIC8vIEFsbAorICAgIHZvaWQgc2xvdFVzZXIy KCk7ICAgLy8gU2tpcAorICAgIHZvaWQgc2xvdFVzZXIzKCk7ICAgLy8gWWVzCisgICAgdm9pZCBz bG90Q2xvc2UoKTsKK307CisjZW5kaWYK --------------Boundary-00=_N1ZY94R2BOUVWH2GDZ17--